@orion-js/paginated-mongodb 4.2.10 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +16 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +17 -16
- package/dist/index.js.map +1 -1
- package/package.json +20 -21
- package/LICENSE +0 -21
package/dist/index.cjs
CHANGED
|
@@ -32,7 +32,7 @@ var import_resolvers2 = require("@orion-js/resolvers");
|
|
|
32
32
|
// src/paginatedResolver/params.ts
|
|
33
33
|
var import_schema = require("@orion-js/schema");
|
|
34
34
|
var import_helpers = require("@orion-js/helpers");
|
|
35
|
-
Symbol.metadata ?? (Symbol.metadata = Symbol("Symbol.metadata"));
|
|
35
|
+
Symbol.metadata ?? (Symbol.metadata = /* @__PURE__ */ Symbol("Symbol.metadata"));
|
|
36
36
|
var paginatedResolverBaseParamsSchema = {
|
|
37
37
|
page: {
|
|
38
38
|
type: "integer",
|
|
@@ -353,21 +353,22 @@ var import_graphql = require("@orion-js/graphql");
|
|
|
353
353
|
function PaginatedQuery(options) {
|
|
354
354
|
return (method, context) => {
|
|
355
355
|
const propertyKey = String(context.name);
|
|
356
|
-
context.
|
|
357
|
-
const
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
356
|
+
if (context.kind === "method") {
|
|
357
|
+
const params = (0, import_graphql.getTargetMetadata)(method, propertyKey, "params") || {};
|
|
358
|
+
const returns = (0, import_graphql.getTargetMetadata)(method, propertyKey, "returns") || "string";
|
|
359
|
+
(0, import_graphql.registerPendingResolver)(
|
|
360
|
+
propertyKey,
|
|
361
|
+
(instance) => createPaginatedResolver({
|
|
362
|
+
params,
|
|
363
|
+
returns,
|
|
362
364
|
...options,
|
|
363
|
-
getCursor:
|
|
364
|
-
})
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
});
|
|
365
|
+
getCursor: instance[propertyKey].bind(instance)
|
|
366
|
+
})
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
if (context.kind === "field") {
|
|
370
|
+
(0, import_graphql.registerPendingResolver)(propertyKey, (instance) => instance[propertyKey]);
|
|
371
|
+
}
|
|
371
372
|
return method;
|
|
372
373
|
};
|
|
373
374
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/paginatedResolver/index.ts","../src/paginatedResolver/params.ts","../src/paginatedResolver/setOptions.ts","../src/paginatedResolver/getModel.ts","../src/tokenPaginatedResolver/index.ts","../src/tokenPaginatedResolver/getReturnModel.ts","../src/service/index.ts"],"sourcesContent":["import {paginatedResolver, createPaginatedResolver} from './paginatedResolver'\nimport tokenPaginatedResolver from './tokenPaginatedResolver'\n\nexport {paginatedResolver, tokenPaginatedResolver, createPaginatedResolver}\n\nexport * from './service'\n","import {createResolver, getResolverArgs, internal_schemaWithResolvers} from '@orion-js/resolvers'\nimport {getPaginatedResolverParams, paginatedResolverBaseParamsSchema} from './params'\nimport setOptions from './setOptions'\nimport {getSchemaWithMetadataFromAnyOrionForm, InferSchemaType, Schema} from '@orion-js/schema'\nimport {getPaginatedResolverResolvers, getPaginatedResolverReturnSchema} from './getModel'\n\nexport interface PaginatedCursor<TReturns extends Schema = any> {\n count?: () => Promise<number> | number\n toArray: () => Promise<InferSchemaType<TReturns>[]>\n limit?: (newLimit: number) => void\n skip?: (newSkip: number) => void\n sort?: (newSort: {[key: string]: 1 | -1}) => void\n}\n\nexport type PaginatedResolverGetCursorResultWithCount<TReturns extends Schema = any> = {\n count: () => Promise<number> | number\n cursor: PaginatedCursor<TReturns>\n}\n\nexport type PaginatedResolverGetCursorResult<TReturns extends Schema = any> =\n | PaginatedCursor<TReturns>\n | PaginatedResolverGetCursorResultWithCount<TReturns>\n\nexport interface PaginatedResolverOpts<\n TParams extends Schema = any,\n TReturns extends Schema = any,\n TViewer = any,\n> {\n returns: TReturns\n getCursor: (\n params?: InferSchemaType<typeof paginatedResolverBaseParamsSchema & TParams>,\n viewer?: TViewer,\n ) => Promise<PaginatedResolverGetCursorResult<TReturns>>\n allowedSorts?: string[]\n defaultSortBy?: string\n defaultSortType?: 'asc' | 'desc'\n params?: TParams\n modelName?: string\n /**\n * @deprecated Just check the permissions in the resolver instead\n */\n permissionsOptions?: any\n}\n\nexport function createPaginatedResolver<\n TParams extends Schema = any,\n TReturns extends Schema = any,\n TViewer = any,\n>({\n returns,\n params,\n allowedSorts,\n defaultSortBy,\n defaultSortType,\n getCursor,\n modelName,\n ...otherOptions\n}: PaginatedResolverOpts<TParams, TReturns, TViewer>) {\n const getCursorResult = async (...args) => {\n const result = await getCursor(...args)\n if ((result as PaginatedResolverGetCursorResultWithCount).cursor) {\n const resultWithCount = result as PaginatedResolverGetCursorResultWithCount\n return {cursor: resultWithCount.cursor, getCount: () => resultWithCount.count()}\n }\n const resultWithoutCount = result as PaginatedCursor\n return {cursor: resultWithoutCount, getCount: () => resultWithoutCount.count()}\n }\n\n const ReturnsModel = getSchemaWithMetadataFromAnyOrionForm(returns)\n const finalModelName = modelName || `Paginated${ReturnsModel.__modelName}`\n const paginatedParams = getPaginatedResolverParams<TParams>({\n params,\n allowedSorts,\n defaultSortBy,\n defaultSortType,\n })\n const baseReturnSchema = getPaginatedResolverReturnSchema(paginatedParams)\n const resolvers = getPaginatedResolverResolvers<TParams, TReturns>(modelName, returns)\n\n return createResolver({\n params: paginatedParams,\n returns: internal_schemaWithResolvers({\n name: finalModelName,\n schema: baseReturnSchema,\n resolvers: resolvers as any,\n }) as typeof baseReturnSchema,\n async resolve(...args) {\n const {params, viewer} = getResolverArgs(...args)\n const {cursor, getCount} = await getCursorResult(...args)\n\n /* counting the total number of elements of this cursor, so we make sure\n that it is going to be computed only once */\n const count = await getCount()\n const options = setOptions(params, cursor)\n\n return {\n cursor,\n params,\n viewer,\n options,\n count,\n }\n },\n ...otherOptions,\n })\n}\n\n/**\n * @deprecated Use createPaginatedResolver instead\n */\nexport const paginatedResolver = createPaginatedResolver\n","import {getSchemaFromAnyOrionForm, Schema} from '@orion-js/schema'\nimport {PaginatedResolverOpts} from '.'\nimport {clone} from '@orion-js/helpers'\n\n// @ts-ignore polyfill for Symbol.metadata // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#decorator-metadata\nSymbol.metadata ??= Symbol('Symbol.metadata')\n\ntype OptionsKeys = 'params' | 'allowedSorts' | 'defaultSortBy' | 'defaultSortType'\n\nexport const paginatedResolverBaseParamsSchema = {\n page: {\n type: 'integer',\n defaultValue: 1,\n optional: true,\n min: 1,\n },\n limit: {\n type: 'integer',\n defaultValue: 20,\n optional: true,\n min: 0,\n max: 200,\n },\n sortBy: {\n type: String,\n optional: true,\n },\n sortType: {\n type: String,\n allowedValues: ['asc', 'desc'],\n optional: true,\n },\n} as const\n\nexport function getPaginatedResolverParams<const TDefinedParams extends Schema>(\n options: Pick<PaginatedResolverOpts, OptionsKeys>,\n): typeof paginatedResolverBaseParamsSchema & TDefinedParams {\n const {params, allowedSorts, defaultSortBy, defaultSortType} = options\n const paramsSchema = (params ? getSchemaFromAnyOrionForm(params) : {}) as Schema\n\n const schema = clone({\n ...paginatedResolverBaseParamsSchema,\n ...(paramsSchema || {}),\n })\n\n if (allowedSorts?.length) {\n // @ts-ignore\n schema.sortBy.allowedValues = allowedSorts\n if (defaultSortBy) {\n // @ts-ignore\n schema.sortBy.defaultValue = defaultSortBy\n }\n if (defaultSortType) {\n // @ts-ignore\n schema.sortType.defaultValue = defaultSortType\n }\n } else {\n delete schema.sortBy\n delete schema.sortType\n }\n\n return schema as any\n}\n","import {PaginatedCursor} from './index'\n\nexport default function ({page, limit, sortBy, sortType}, cursor: PaginatedCursor) {\n const skip = limit * (page - 1)\n\n if (limit && cursor.limit) {\n cursor.limit(limit)\n }\n\n if (skip && cursor.skip) {\n cursor.skip(skip)\n }\n\n if (sortBy && sortType && cursor.sort) {\n cursor.sort({\n [`${sortBy}`]: sortType === 'asc' ? 1 : -1,\n })\n }\n\n return {\n skip,\n limit,\n }\n}\n","import {hashObject} from '@orion-js/helpers'\nimport {createModelResolver} from '@orion-js/resolvers'\nimport {getSchemaFromAnyOrionForm, InferSchemaType, Schema} from '@orion-js/schema'\nimport {PaginatedCursor} from '.'\n\nexport function getPaginatedResolverReturnSchema<TParams extends Schema>(paramsSchema: TParams) {\n return {\n cursor: {\n type: 'any',\n private: true,\n },\n params: {\n type: paramsSchema,\n private: true,\n },\n viewer: {\n type: 'any',\n private: true,\n },\n options: {\n type: 'any',\n private: true,\n },\n count: {\n type: 'integer',\n private: true,\n },\n } as const\n}\n\ntype PaginatedModelResolversInput<TParams extends Schema, TReturns extends Schema> = {\n cursor: PaginatedCursor<TReturns>\n params: InferSchemaType<TParams>\n viewer: any\n options: any\n count: number\n}\n\nexport function getPaginatedResolverResolvers<TParams extends Schema, TReturns extends Schema>(\n modelName: string,\n returns: TReturns,\n) {\n type Item = PaginatedModelResolversInput<TParams, TReturns>\n\n const getTotalCount = async (paginated: Item) => {\n if (typeof paginated.count === 'undefined') {\n paginated.count = await paginated.cursor.count()\n }\n return paginated.count\n }\n\n const _id = createModelResolver<Item>({\n returns: 'ID',\n async resolve(paginated, viewer): Promise<string> {\n const {params} = paginated\n return hashObject({\n modelName: modelName,\n userId: viewer.userId,\n params: params,\n })\n },\n })\n\n const totalCount = createModelResolver<Item>({\n returns: 'integer',\n resolve: getTotalCount,\n })\n\n const totalPages = createModelResolver<Item>({\n returns: 'integer',\n async resolve(paginated) {\n const count = await getTotalCount(paginated)\n if (!paginated.options.limit) return 1\n return Math.ceil(count / paginated.options.limit)\n },\n })\n\n const hasNextPage = createModelResolver<Item>({\n returns: Boolean,\n async resolve(paginated) {\n const count = await getTotalCount(paginated)\n const {skip, limit} = paginated.options\n if (!limit) return false\n return skip + limit < count\n },\n })\n\n const hasPreviousPage = createModelResolver<Item>({\n returns: Boolean,\n async resolve(paginated) {\n const count = await getTotalCount(paginated)\n const {skip} = paginated.options\n return count && skip !== 0\n },\n })\n\n const items = createModelResolver<Item>({\n returns: [getSchemaFromAnyOrionForm(returns)],\n async resolve(params) {\n const result = (await params.cursor.toArray()) as InferSchemaType<TReturns[]>\n return result\n },\n })\n\n return {\n _id,\n totalCount,\n totalPages,\n hasNextPage,\n hasPreviousPage,\n items,\n }\n}\n","import {createResolver} from '@orion-js/resolvers'\nimport getReturnModel from './getReturnModel'\nimport {getResolverArgs} from '@orion-js/resolvers'\n\nexport default function ({collection, params, resolve, ...otherOptions}) {\n /* executes the resolve function, obtaining the query that will\n be applied to the collection */\n const runResolve = async (...args: any[]) => {\n if (resolve) {\n return await resolve(...args)\n }\n return {query: {}}\n }\n\n /* This function does the query to the collection. The logic is based \n in this article:\n https://medium.com/swlh/mongodb-pagination-fast-consistent-ece2a97070f3 */\n const getCursor = async ({query, sort: sortingCriteria, limit, idOffset}) => {\n if (sortingCriteria && Object.keys(sortingCriteria).length > 1)\n throw new Error('sorting criteria supports at most one field')\n\n if (!sortingCriteria || !Object.keys(sortingCriteria).length) {\n sortingCriteria = {_id: 1}\n if (idOffset) query = {...query, _id: {$gt: idOffset}}\n } else {\n const sortingField = Object.keys(sortingCriteria)[0]\n\n sortingCriteria = {...sortingCriteria, _id: 1}\n\n if (idOffset) {\n const offsetDocument = await collection.findOne({_id: idOffset})\n\n const {[sortingField]: originalSortingFieldQuery, ...restOfQuery} = query\n\n /* Suppose the following documents, and pages with 2 elements on each page:\n [\n {_id: 1, name: 'a', v: 1},\n {_id: 2, name: 'b', v: 2},\n {_id: 3, name: 'c', v: 2},\n {_id: 4, name: 'd', v: 3},\n {_id: 5, name: 'e', v: 4},\n ]\n\n If the query results are sorted by {v: 1}, then the first page will\n contain the documents with ids 1 & 2, and the last one will be the document\n with id 2.\n In order to get the documents of the second page, we cannot get the documents\n with the sorting criteria (v) greater than the last document, because we\n would skip the document with id 3. In that case, we need to get all the\n documents where either:\n 1.- The sorting field is the same than the last one, and the _id field is greater\n 2.- The sorting field is greater than the last one.\n\n In this case, we can get the documents of the second page with the following query:\n\n {\n $or: [\n {\n v: 2,\n _id: {$gt: 2}\n },\n {\n v: {$gt: 2}\n }\n ]\n }\n\n For decreasing order it is exactly the same, but the second part of the or has\n to be changed for $lt.\n */\n const sortOperator = sortingCriteria[sortingField] === 1 ? '$gt' : '$lt'\n query = {\n $or: [\n {...restOfQuery, [sortingField]: offsetDocument[sortingField], _id: {$gt: idOffset}},\n {...query, [sortingField]: {[sortOperator]: offsetDocument[sortingField]}},\n ],\n }\n }\n }\n\n return collection.find(query).sort(sortingCriteria).limit(limit)\n }\n\n const validateQuery = async query => {\n if (typeof query === 'object') {\n const fields = Object.keys(query)\n\n fields.forEach(field => {\n if (['$or', '$expr'].includes(field)) {\n throw new Error(\"tokenPaginatedResolvers don't support $or nor $expr on query\")\n }\n\n if (typeof query[field] === 'object') validateQuery(query[field])\n else if (Array.isArray(query[field]))\n query[field].forEach(queryElement => validateQuery(queryElement))\n })\n }\n }\n\n const {modelName} = otherOptions\n\n return createResolver({\n params: {\n ...params,\n idOffset: {\n type: 'ID',\n optional: true,\n },\n limit: {\n type: 'integer',\n defaultValue: 10,\n min: 1,\n max: 200,\n },\n } as any,\n returns: getReturnModel({modelName, collection}) as any,\n async resolve(...args) {\n const {params, viewer} = getResolverArgs(...args)\n const {query, sort} = await runResolve(...args)\n\n if (!query) throw new Error(\"'query' object not found in return of resolve function\")\n\n await validateQuery(query)\n\n const cursor = await getCursor({...params, query, sort})\n\n return {\n params,\n cursor,\n viewer,\n }\n },\n ...otherOptions,\n })\n}\n","import {createModel} from '@orion-js/models'\nimport {modelResolver} from '@orion-js/resolvers'\n\nexport default ({collection, modelName}) => {\n const items = modelResolver({\n returns: [collection.model],\n async resolve(params) {\n const {cursor} = params\n return await cursor.toArray()\n },\n })\n\n return createModel({\n name: modelName || `tokenPaginated${collection.model.name}`,\n resolvers: {\n items,\n },\n })\n}\n","import {createPaginatedResolver, PaginatedResolverOpts} from '../paginatedResolver'\nimport {internalResolversMetadata, getTargetMetadata} from '@orion-js/graphql'\n\nexport interface PagiantedQueryDescriptor extends Omit<PropertyDecorator, 'value'> {\n value?: PaginatedResolverOpts['getCursor']\n}\n\nexport function PaginatedQuery(): (method: any, context: ClassFieldDecoratorContext) => any\nexport function PaginatedQuery(\n options: Omit<PaginatedResolverOpts, 'getCursor'>,\n): (method: any, context: ClassMethodDecoratorContext) => any\nexport function PaginatedQuery(options?: Omit<PaginatedResolverOpts, 'getCursor'>) {\n return (method: any, context: ClassFieldDecoratorContext | ClassMethodDecoratorContext) => {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this) {\n const resolvers = internalResolversMetadata.get(this) || {}\n\n if (context.kind === 'method') {\n resolvers[propertyKey] = createPaginatedResolver({\n params: getTargetMetadata(method, propertyKey, 'params') || {},\n returns: getTargetMetadata(method, propertyKey, 'returns') || 'string',\n ...options,\n getCursor: this[propertyKey].bind(this),\n })\n }\n\n if (context.kind === 'field') {\n resolvers[propertyKey] = this[propertyKey]\n }\n\n internalResolversMetadata.set(this, resolvers)\n })\n\n return method\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,oBAA4E;;;ACA5E,oBAAgD;AAEhD,qBAAoB;AAGpB,OAAO,aAAP,OAAO,WAAa,OAAO,iBAAiB;AAIrC,IAAM,oCAAoC;AAAA,EAC/C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,UAAU;AAAA,IACV,KAAK;AAAA,EACP;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,cAAc;AAAA,IACd,UAAU;AAAA,IACV,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,eAAe,CAAC,OAAO,MAAM;AAAA,IAC7B,UAAU;AAAA,EACZ;AACF;AAEO,SAAS,2BACd,SAC2D;AAC3D,QAAM,EAAC,QAAQ,cAAc,eAAe,gBAAe,IAAI;AAC/D,QAAM,eAAgB,aAAS,yCAA0B,MAAM,IAAI,CAAC;AAEpE,QAAM,aAAS,sBAAM;AAAA,IACnB,GAAG;AAAA,IACH,GAAI,gBAAgB,CAAC;AAAA,EACvB,CAAC;AAED,MAAI,6CAAc,QAAQ;AAExB,WAAO,OAAO,gBAAgB;AAC9B,QAAI,eAAe;AAEjB,aAAO,OAAO,eAAe;AAAA,IAC/B;AACA,QAAI,iBAAiB;AAEnB,aAAO,SAAS,eAAe;AAAA,IACjC;AAAA,EACF,OAAO;AACL,WAAO,OAAO;AACd,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO;AACT;;;AC5De,SAAR,mBAAkB,EAAC,MAAM,OAAO,QAAQ,SAAQ,GAAG,QAAyB;AACjF,QAAM,OAAO,SAAS,OAAO;AAE7B,MAAI,SAAS,OAAO,OAAO;AACzB,WAAO,MAAM,KAAK;AAAA,EACpB;AAEA,MAAI,QAAQ,OAAO,MAAM;AACvB,WAAO,KAAK,IAAI;AAAA,EAClB;AAEA,MAAI,UAAU,YAAY,OAAO,MAAM;AACrC,WAAO,KAAK;AAAA,MACV,CAAC,GAAG,MAAM,EAAE,GAAG,aAAa,QAAQ,IAAI;AAAA,IAC1C,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;AFpBA,IAAAC,iBAA6E;;;AGH7E,IAAAC,kBAAyB;AACzB,uBAAkC;AAClC,IAAAC,iBAAiE;AAG1D,SAAS,iCAAyD,cAAuB;AAC9F,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAUO,SAAS,8BACd,WACA,SACA;AAGA,QAAM,gBAAgB,OAAO,cAAoB;AAC/C,QAAI,OAAO,UAAU,UAAU,aAAa;AAC1C,gBAAU,QAAQ,MAAM,UAAU,OAAO,MAAM;AAAA,IACjD;AACA,WAAO,UAAU;AAAA,EACnB;AAEA,QAAM,UAAM,sCAA0B;AAAA,IACpC,SAAS;AAAA,IACT,MAAM,QAAQ,WAAW,QAAyB;AAChD,YAAM,EAAC,OAAM,IAAI;AACjB,iBAAO,4BAAW;AAAA,QAChB;AAAA,QACA,QAAQ,OAAO;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,QAAM,iBAAa,sCAA0B;AAAA,IAC3C,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,QAAM,iBAAa,sCAA0B;AAAA,IAC3C,SAAS;AAAA,IACT,MAAM,QAAQ,WAAW;AACvB,YAAM,QAAQ,MAAM,cAAc,SAAS;AAC3C,UAAI,CAAC,UAAU,QAAQ,MAAO,QAAO;AACrC,aAAO,KAAK,KAAK,QAAQ,UAAU,QAAQ,KAAK;AAAA,IAClD;AAAA,EACF,CAAC;AAED,QAAM,kBAAc,sCAA0B;AAAA,IAC5C,SAAS;AAAA,IACT,MAAM,QAAQ,WAAW;AACvB,YAAM,QAAQ,MAAM,cAAc,SAAS;AAC3C,YAAM,EAAC,MAAM,MAAK,IAAI,UAAU;AAChC,UAAI,CAAC,MAAO,QAAO;AACnB,aAAO,OAAO,QAAQ;AAAA,IACxB;AAAA,EACF,CAAC;AAED,QAAM,sBAAkB,sCAA0B;AAAA,IAChD,SAAS;AAAA,IACT,MAAM,QAAQ,WAAW;AACvB,YAAM,QAAQ,MAAM,cAAc,SAAS;AAC3C,YAAM,EAAC,KAAI,IAAI,UAAU;AACzB,aAAO,SAAS,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,QAAM,YAAQ,sCAA0B;AAAA,IACtC,SAAS,KAAC,0CAA0B,OAAO,CAAC;AAAA,IAC5C,MAAM,QAAQ,QAAQ;AACpB,YAAM,SAAU,MAAM,OAAO,OAAO,QAAQ;AAC5C,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AHpEO,SAAS,wBAId;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAsD;AACpD,QAAM,kBAAkB,UAAU,SAAS;AACzC,UAAM,SAAS,MAAM,UAAU,GAAG,IAAI;AACtC,QAAK,OAAqD,QAAQ;AAChE,YAAM,kBAAkB;AACxB,aAAO,EAAC,QAAQ,gBAAgB,QAAQ,UAAU,MAAM,gBAAgB,MAAM,EAAC;AAAA,IACjF;AACA,UAAM,qBAAqB;AAC3B,WAAO,EAAC,QAAQ,oBAAoB,UAAU,MAAM,mBAAmB,MAAM,EAAC;AAAA,EAChF;AAEA,QAAM,mBAAe,sDAAsC,OAAO;AAClE,QAAM,iBAAiB,aAAa,YAAY,aAAa,WAAW;AACxE,QAAM,kBAAkB,2BAAoC;AAAA,IAC1D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,mBAAmB,iCAAiC,eAAe;AACzE,QAAM,YAAY,8BAAiD,WAAW,OAAO;AAErF,aAAO,kCAAe;AAAA,IACpB,QAAQ;AAAA,IACR,aAAS,gDAA6B;AAAA,MACpC,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,IACD,MAAM,WAAW,MAAM;AACrB,YAAM,EAAC,QAAAC,SAAQ,OAAM,QAAI,mCAAgB,GAAG,IAAI;AAChD,YAAM,EAAC,QAAQ,SAAQ,IAAI,MAAM,gBAAgB,GAAG,IAAI;AAIxD,YAAM,QAAQ,MAAM,SAAS;AAC7B,YAAM,UAAU,mBAAWA,SAAQ,MAAM;AAEzC,aAAO;AAAA,QACL;AAAA,QACA,QAAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACH;AAKO,IAAM,oBAAoB;;;AI9GjC,IAAAC,oBAA6B;;;ACA7B,oBAA0B;AAC1B,IAAAC,oBAA4B;AAE5B,IAAO,yBAAQ,CAAC,EAAC,YAAY,UAAS,MAAM;AAC1C,QAAM,YAAQ,iCAAc;AAAA,IAC1B,SAAS,CAAC,WAAW,KAAK;AAAA,IAC1B,MAAM,QAAQ,QAAQ;AACpB,YAAM,EAAC,OAAM,IAAI;AACjB,aAAO,MAAM,OAAO,QAAQ;AAAA,IAC9B;AAAA,EACF,CAAC;AAED,aAAO,2BAAY;AAAA,IACjB,MAAM,aAAa,iBAAiB,WAAW,MAAM,IAAI;AAAA,IACzD,WAAW;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ADhBA,IAAAC,oBAA8B;AAEf,SAAR,+BAAkB,EAAC,YAAY,QAAQ,SAAS,GAAG,aAAY,GAAG;AAGvE,QAAM,aAAa,UAAU,SAAgB;AAC3C,QAAI,SAAS;AACX,aAAO,MAAM,QAAQ,GAAG,IAAI;AAAA,IAC9B;AACA,WAAO,EAAC,OAAO,CAAC,EAAC;AAAA,EACnB;AAKA,QAAM,YAAY,OAAO,EAAC,OAAO,MAAM,iBAAiB,OAAO,SAAQ,MAAM;AAC3E,QAAI,mBAAmB,OAAO,KAAK,eAAe,EAAE,SAAS;AAC3D,YAAM,IAAI,MAAM,6CAA6C;AAE/D,QAAI,CAAC,mBAAmB,CAAC,OAAO,KAAK,eAAe,EAAE,QAAQ;AAC5D,wBAAkB,EAAC,KAAK,EAAC;AACzB,UAAI,SAAU,SAAQ,EAAC,GAAG,OAAO,KAAK,EAAC,KAAK,SAAQ,EAAC;AAAA,IACvD,OAAO;AACL,YAAM,eAAe,OAAO,KAAK,eAAe,EAAE,CAAC;AAEnD,wBAAkB,EAAC,GAAG,iBAAiB,KAAK,EAAC;AAE7C,UAAI,UAAU;AACZ,cAAM,iBAAiB,MAAM,WAAW,QAAQ,EAAC,KAAK,SAAQ,CAAC;AAE/D,cAAM,EAAC,CAAC,YAAY,GAAG,2BAA2B,GAAG,YAAW,IAAI;AAsCpE,cAAM,eAAe,gBAAgB,YAAY,MAAM,IAAI,QAAQ;AACnE,gBAAQ;AAAA,UACN,KAAK;AAAA,YACH,EAAC,GAAG,aAAa,CAAC,YAAY,GAAG,eAAe,YAAY,GAAG,KAAK,EAAC,KAAK,SAAQ,EAAC;AAAA,YACnF,EAAC,GAAG,OAAO,CAAC,YAAY,GAAG,EAAC,CAAC,YAAY,GAAG,eAAe,YAAY,EAAC,EAAC;AAAA,UAC3E;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,WAAW,KAAK,KAAK,EAAE,KAAK,eAAe,EAAE,MAAM,KAAK;AAAA,EACjE;AAEA,QAAM,gBAAgB,OAAM,UAAS;AACnC,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,SAAS,OAAO,KAAK,KAAK;AAEhC,aAAO,QAAQ,WAAS;AACtB,YAAI,CAAC,OAAO,OAAO,EAAE,SAAS,KAAK,GAAG;AACpC,gBAAM,IAAI,MAAM,8DAA8D;AAAA,QAChF;AAEA,YAAI,OAAO,MAAM,KAAK,MAAM,SAAU,eAAc,MAAM,KAAK,CAAC;AAAA,iBACvD,MAAM,QAAQ,MAAM,KAAK,CAAC;AACjC,gBAAM,KAAK,EAAE,QAAQ,kBAAgB,cAAc,YAAY,CAAC;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,EAAC,UAAS,IAAI;AAEpB,aAAO,kCAAe;AAAA,IACpB,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,UAAU;AAAA,QACR,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,cAAc;AAAA,QACd,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,IACF;AAAA,IACA,SAAS,uBAAe,EAAC,WAAW,WAAU,CAAC;AAAA,IAC/C,MAAM,WAAW,MAAM;AACrB,YAAM,EAAC,QAAAC,SAAQ,OAAM,QAAI,mCAAgB,GAAG,IAAI;AAChD,YAAM,EAAC,OAAO,KAAI,IAAI,MAAM,WAAW,GAAG,IAAI;AAE9C,UAAI,CAAC,MAAO,OAAM,IAAI,MAAM,wDAAwD;AAEpF,YAAM,cAAc,KAAK;AAEzB,YAAM,SAAS,MAAM,UAAU,EAAC,GAAGA,SAAQ,OAAO,KAAI,CAAC;AAEvD,aAAO;AAAA,QACL,QAAAA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACH;;;AErIA,qBAA2D;AAUpD,SAAS,eAAe,SAAoD;AACjF,SAAO,CAAC,QAAa,YAAsE;AACzF,UAAM,cAAc,OAAO,QAAQ,IAAI;AAEvC,YAAQ,eAAe,WAAgB;AACrC,YAAM,YAAY,yCAA0B,IAAI,IAAI,KAAK,CAAC;AAE1D,UAAI,QAAQ,SAAS,UAAU;AAC7B,kBAAU,WAAW,IAAI,wBAAwB;AAAA,UAC/C,YAAQ,kCAAkB,QAAQ,aAAa,QAAQ,KAAK,CAAC;AAAA,UAC7D,aAAS,kCAAkB,QAAQ,aAAa,SAAS,KAAK;AAAA,UAC9D,GAAG;AAAA,UACH,WAAW,KAAK,WAAW,EAAE,KAAK,IAAI;AAAA,QACxC,CAAC;AAAA,MACH;AAEA,UAAI,QAAQ,SAAS,SAAS;AAC5B,kBAAU,WAAW,IAAI,KAAK,WAAW;AAAA,MAC3C;AAEA,+CAA0B,IAAI,MAAM,SAAS;AAAA,IAC/C,CAAC;AAED,WAAO;AAAA,EACT;AACF;","names":["import_resolvers","import_schema","import_helpers","import_schema","params","import_resolvers","import_resolvers","import_resolvers","params"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/paginatedResolver/index.ts","../src/paginatedResolver/params.ts","../src/paginatedResolver/setOptions.ts","../src/paginatedResolver/getModel.ts","../src/tokenPaginatedResolver/index.ts","../src/tokenPaginatedResolver/getReturnModel.ts","../src/service/index.ts"],"sourcesContent":["import {paginatedResolver, createPaginatedResolver} from './paginatedResolver'\nimport tokenPaginatedResolver from './tokenPaginatedResolver'\n\nexport {paginatedResolver, tokenPaginatedResolver, createPaginatedResolver}\n\nexport * from './service'\n","import {createResolver, getResolverArgs, internal_schemaWithResolvers} from '@orion-js/resolvers'\nimport {getPaginatedResolverParams, paginatedResolverBaseParamsSchema} from './params'\nimport setOptions from './setOptions'\nimport {getSchemaWithMetadataFromAnyOrionForm, InferSchemaType, Schema} from '@orion-js/schema'\nimport {getPaginatedResolverResolvers, getPaginatedResolverReturnSchema} from './getModel'\n\nexport interface PaginatedCursor<TReturns extends Schema = any> {\n count?: () => Promise<number> | number\n toArray: () => Promise<InferSchemaType<TReturns>[]>\n limit?: (newLimit: number) => void\n skip?: (newSkip: number) => void\n sort?: (newSort: {[key: string]: 1 | -1}) => void\n}\n\nexport type PaginatedResolverGetCursorResultWithCount<TReturns extends Schema = any> = {\n count: () => Promise<number> | number\n cursor: PaginatedCursor<TReturns>\n}\n\nexport type PaginatedResolverGetCursorResult<TReturns extends Schema = any> =\n | PaginatedCursor<TReturns>\n | PaginatedResolverGetCursorResultWithCount<TReturns>\n\nexport interface PaginatedResolverOpts<\n TParams extends Schema = any,\n TReturns extends Schema = any,\n TViewer = any,\n> {\n returns: TReturns\n getCursor: (\n params?: InferSchemaType<typeof paginatedResolverBaseParamsSchema & TParams>,\n viewer?: TViewer,\n ) => Promise<PaginatedResolverGetCursorResult<TReturns>>\n allowedSorts?: string[]\n defaultSortBy?: string\n defaultSortType?: 'asc' | 'desc'\n params?: TParams\n modelName?: string\n /**\n * @deprecated Just check the permissions in the resolver instead\n */\n permissionsOptions?: any\n}\n\nexport function createPaginatedResolver<\n TParams extends Schema = any,\n TReturns extends Schema = any,\n TViewer = any,\n>({\n returns,\n params,\n allowedSorts,\n defaultSortBy,\n defaultSortType,\n getCursor,\n modelName,\n ...otherOptions\n}: PaginatedResolverOpts<TParams, TReturns, TViewer>) {\n const getCursorResult = async (...args) => {\n const result = await getCursor(...args)\n if ((result as PaginatedResolverGetCursorResultWithCount).cursor) {\n const resultWithCount = result as PaginatedResolverGetCursorResultWithCount\n return {cursor: resultWithCount.cursor, getCount: () => resultWithCount.count()}\n }\n const resultWithoutCount = result as PaginatedCursor\n return {cursor: resultWithoutCount, getCount: () => resultWithoutCount.count()}\n }\n\n const ReturnsModel = getSchemaWithMetadataFromAnyOrionForm(returns)\n const finalModelName = modelName || `Paginated${ReturnsModel.__modelName}`\n const paginatedParams = getPaginatedResolverParams<TParams>({\n params,\n allowedSorts,\n defaultSortBy,\n defaultSortType,\n })\n const baseReturnSchema = getPaginatedResolverReturnSchema(paginatedParams)\n const resolvers = getPaginatedResolverResolvers<TParams, TReturns>(modelName, returns)\n\n return createResolver({\n params: paginatedParams,\n returns: internal_schemaWithResolvers({\n name: finalModelName,\n schema: baseReturnSchema,\n resolvers: resolvers as any,\n }) as typeof baseReturnSchema,\n async resolve(...args) {\n const {params, viewer} = getResolverArgs(...args)\n const {cursor, getCount} = await getCursorResult(...args)\n\n /* counting the total number of elements of this cursor, so we make sure\n that it is going to be computed only once */\n const count = await getCount()\n const options = setOptions(params, cursor)\n\n return {\n cursor,\n params,\n viewer,\n options,\n count,\n }\n },\n ...otherOptions,\n })\n}\n\n/**\n * @deprecated Use createPaginatedResolver instead\n */\nexport const paginatedResolver = createPaginatedResolver\n","import {getSchemaFromAnyOrionForm, Schema} from '@orion-js/schema'\nimport {PaginatedResolverOpts} from '.'\nimport {clone} from '@orion-js/helpers'\n\n// @ts-ignore polyfill for Symbol.metadata // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#decorator-metadata\nSymbol.metadata ??= Symbol('Symbol.metadata')\n\ntype OptionsKeys = 'params' | 'allowedSorts' | 'defaultSortBy' | 'defaultSortType'\n\nexport const paginatedResolverBaseParamsSchema = {\n page: {\n type: 'integer',\n defaultValue: 1,\n optional: true,\n min: 1,\n },\n limit: {\n type: 'integer',\n defaultValue: 20,\n optional: true,\n min: 0,\n max: 200,\n },\n sortBy: {\n type: String,\n optional: true,\n },\n sortType: {\n type: String,\n allowedValues: ['asc', 'desc'],\n optional: true,\n },\n} as const\n\nexport function getPaginatedResolverParams<const TDefinedParams extends Schema>(\n options: Pick<PaginatedResolverOpts, OptionsKeys>,\n): typeof paginatedResolverBaseParamsSchema & TDefinedParams {\n const {params, allowedSorts, defaultSortBy, defaultSortType} = options\n const paramsSchema = (params ? getSchemaFromAnyOrionForm(params) : {}) as Schema\n\n const schema = clone({\n ...paginatedResolverBaseParamsSchema,\n ...(paramsSchema || {}),\n })\n\n if (allowedSorts?.length) {\n // @ts-ignore\n schema.sortBy.allowedValues = allowedSorts\n if (defaultSortBy) {\n // @ts-ignore\n schema.sortBy.defaultValue = defaultSortBy\n }\n if (defaultSortType) {\n // @ts-ignore\n schema.sortType.defaultValue = defaultSortType\n }\n } else {\n delete schema.sortBy\n delete schema.sortType\n }\n\n return schema as any\n}\n","import {PaginatedCursor} from './index'\n\nexport default function ({page, limit, sortBy, sortType}, cursor: PaginatedCursor) {\n const skip = limit * (page - 1)\n\n if (limit && cursor.limit) {\n cursor.limit(limit)\n }\n\n if (skip && cursor.skip) {\n cursor.skip(skip)\n }\n\n if (sortBy && sortType && cursor.sort) {\n cursor.sort({\n [`${sortBy}`]: sortType === 'asc' ? 1 : -1,\n })\n }\n\n return {\n skip,\n limit,\n }\n}\n","import {hashObject} from '@orion-js/helpers'\nimport {createModelResolver} from '@orion-js/resolvers'\nimport {getSchemaFromAnyOrionForm, InferSchemaType, Schema} from '@orion-js/schema'\nimport {PaginatedCursor} from '.'\n\nexport function getPaginatedResolverReturnSchema<TParams extends Schema>(paramsSchema: TParams) {\n return {\n cursor: {\n type: 'any',\n private: true,\n },\n params: {\n type: paramsSchema,\n private: true,\n },\n viewer: {\n type: 'any',\n private: true,\n },\n options: {\n type: 'any',\n private: true,\n },\n count: {\n type: 'integer',\n private: true,\n },\n } as const\n}\n\ntype PaginatedModelResolversInput<TParams extends Schema, TReturns extends Schema> = {\n cursor: PaginatedCursor<TReturns>\n params: InferSchemaType<TParams>\n viewer: any\n options: any\n count: number\n}\n\nexport function getPaginatedResolverResolvers<TParams extends Schema, TReturns extends Schema>(\n modelName: string,\n returns: TReturns,\n) {\n type Item = PaginatedModelResolversInput<TParams, TReturns>\n\n const getTotalCount = async (paginated: Item) => {\n if (typeof paginated.count === 'undefined') {\n paginated.count = await paginated.cursor.count()\n }\n return paginated.count\n }\n\n const _id = createModelResolver<Item>({\n returns: 'ID',\n async resolve(paginated, viewer): Promise<string> {\n const {params} = paginated\n return hashObject({\n modelName: modelName,\n userId: viewer.userId,\n params: params,\n })\n },\n })\n\n const totalCount = createModelResolver<Item>({\n returns: 'integer',\n resolve: getTotalCount,\n })\n\n const totalPages = createModelResolver<Item>({\n returns: 'integer',\n async resolve(paginated) {\n const count = await getTotalCount(paginated)\n if (!paginated.options.limit) return 1\n return Math.ceil(count / paginated.options.limit)\n },\n })\n\n const hasNextPage = createModelResolver<Item>({\n returns: Boolean,\n async resolve(paginated) {\n const count = await getTotalCount(paginated)\n const {skip, limit} = paginated.options\n if (!limit) return false\n return skip + limit < count\n },\n })\n\n const hasPreviousPage = createModelResolver<Item>({\n returns: Boolean,\n async resolve(paginated) {\n const count = await getTotalCount(paginated)\n const {skip} = paginated.options\n return count && skip !== 0\n },\n })\n\n const items = createModelResolver<Item>({\n returns: [getSchemaFromAnyOrionForm(returns)],\n async resolve(params) {\n const result = (await params.cursor.toArray()) as InferSchemaType<TReturns[]>\n return result\n },\n })\n\n return {\n _id,\n totalCount,\n totalPages,\n hasNextPage,\n hasPreviousPage,\n items,\n }\n}\n","import {createResolver} from '@orion-js/resolvers'\nimport getReturnModel from './getReturnModel'\nimport {getResolverArgs} from '@orion-js/resolvers'\n\nexport default function ({collection, params, resolve, ...otherOptions}) {\n /* executes the resolve function, obtaining the query that will\n be applied to the collection */\n const runResolve = async (...args: any[]) => {\n if (resolve) {\n return await resolve(...args)\n }\n return {query: {}}\n }\n\n /* This function does the query to the collection. The logic is based \n in this article:\n https://medium.com/swlh/mongodb-pagination-fast-consistent-ece2a97070f3 */\n const getCursor = async ({query, sort: sortingCriteria, limit, idOffset}) => {\n if (sortingCriteria && Object.keys(sortingCriteria).length > 1)\n throw new Error('sorting criteria supports at most one field')\n\n if (!sortingCriteria || !Object.keys(sortingCriteria).length) {\n sortingCriteria = {_id: 1}\n if (idOffset) query = {...query, _id: {$gt: idOffset}}\n } else {\n const sortingField = Object.keys(sortingCriteria)[0]\n\n sortingCriteria = {...sortingCriteria, _id: 1}\n\n if (idOffset) {\n const offsetDocument = await collection.findOne({_id: idOffset})\n\n const {[sortingField]: originalSortingFieldQuery, ...restOfQuery} = query\n\n /* Suppose the following documents, and pages with 2 elements on each page:\n [\n {_id: 1, name: 'a', v: 1},\n {_id: 2, name: 'b', v: 2},\n {_id: 3, name: 'c', v: 2},\n {_id: 4, name: 'd', v: 3},\n {_id: 5, name: 'e', v: 4},\n ]\n\n If the query results are sorted by {v: 1}, then the first page will\n contain the documents with ids 1 & 2, and the last one will be the document\n with id 2.\n In order to get the documents of the second page, we cannot get the documents\n with the sorting criteria (v) greater than the last document, because we\n would skip the document with id 3. In that case, we need to get all the\n documents where either:\n 1.- The sorting field is the same than the last one, and the _id field is greater\n 2.- The sorting field is greater than the last one.\n\n In this case, we can get the documents of the second page with the following query:\n\n {\n $or: [\n {\n v: 2,\n _id: {$gt: 2}\n },\n {\n v: {$gt: 2}\n }\n ]\n }\n\n For decreasing order it is exactly the same, but the second part of the or has\n to be changed for $lt.\n */\n const sortOperator = sortingCriteria[sortingField] === 1 ? '$gt' : '$lt'\n query = {\n $or: [\n {...restOfQuery, [sortingField]: offsetDocument[sortingField], _id: {$gt: idOffset}},\n {...query, [sortingField]: {[sortOperator]: offsetDocument[sortingField]}},\n ],\n }\n }\n }\n\n return collection.find(query).sort(sortingCriteria).limit(limit)\n }\n\n const validateQuery = async query => {\n if (typeof query === 'object') {\n const fields = Object.keys(query)\n\n fields.forEach(field => {\n if (['$or', '$expr'].includes(field)) {\n throw new Error(\"tokenPaginatedResolvers don't support $or nor $expr on query\")\n }\n\n if (typeof query[field] === 'object') validateQuery(query[field])\n else if (Array.isArray(query[field]))\n query[field].forEach(queryElement => validateQuery(queryElement))\n })\n }\n }\n\n const {modelName} = otherOptions\n\n return createResolver({\n params: {\n ...params,\n idOffset: {\n type: 'ID',\n optional: true,\n },\n limit: {\n type: 'integer',\n defaultValue: 10,\n min: 1,\n max: 200,\n },\n } as any,\n returns: getReturnModel({modelName, collection}) as any,\n async resolve(...args) {\n const {params, viewer} = getResolverArgs(...args)\n const {query, sort} = await runResolve(...args)\n\n if (!query) throw new Error(\"'query' object not found in return of resolve function\")\n\n await validateQuery(query)\n\n const cursor = await getCursor({...params, query, sort})\n\n return {\n params,\n cursor,\n viewer,\n }\n },\n ...otherOptions,\n })\n}\n","import {createModel} from '@orion-js/models'\nimport {modelResolver} from '@orion-js/resolvers'\n\nexport default ({collection, modelName}) => {\n const items = modelResolver({\n returns: [collection.model],\n async resolve(params) {\n const {cursor} = params\n return await cursor.toArray()\n },\n })\n\n return createModel({\n name: modelName || `tokenPaginated${collection.model.name}`,\n resolvers: {\n items,\n },\n })\n}\n","import {createPaginatedResolver, PaginatedResolverOpts} from '../paginatedResolver'\nimport {registerPendingResolver, getTargetMetadata} from '@orion-js/graphql'\n\nexport interface PagiantedQueryDescriptor extends Omit<PropertyDecorator, 'value'> {\n value?: PaginatedResolverOpts['getCursor']\n}\n\nexport function PaginatedQuery(): (method: any, context: ClassFieldDecoratorContext) => any\nexport function PaginatedQuery(\n options: Omit<PaginatedResolverOpts, 'getCursor'>,\n): (method: any, context: ClassMethodDecoratorContext) => any\nexport function PaginatedQuery(options?: Omit<PaginatedResolverOpts, 'getCursor'>) {\n return (method: any, context: ClassFieldDecoratorContext | ClassMethodDecoratorContext) => {\n const propertyKey = String(context.name)\n\n if (context.kind === 'method') {\n const params = getTargetMetadata(method, propertyKey, 'params') || {}\n const returns = getTargetMetadata(method, propertyKey, 'returns') || 'string'\n registerPendingResolver(propertyKey, (instance: any) =>\n createPaginatedResolver({\n params,\n returns,\n ...options,\n getCursor: instance[propertyKey].bind(instance),\n }),\n )\n }\n\n if (context.kind === 'field') {\n registerPendingResolver(propertyKey, (instance: any) => instance[propertyKey])\n }\n\n return method\n }\n}\n"],"mappings":"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","names":["import_resolvers","import_schema","import_helpers","import_schema","params","import_resolvers","import_resolvers","import_resolvers","params"]}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { createResolver, getResolverArgs, internal_schemaWithResolvers } from "@
|
|
|
4
4
|
// src/paginatedResolver/params.ts
|
|
5
5
|
import { getSchemaFromAnyOrionForm } from "@orion-js/schema";
|
|
6
6
|
import { clone } from "@orion-js/helpers";
|
|
7
|
-
Symbol.metadata ?? (Symbol.metadata = Symbol("Symbol.metadata"));
|
|
7
|
+
Symbol.metadata ?? (Symbol.metadata = /* @__PURE__ */ Symbol("Symbol.metadata"));
|
|
8
8
|
var paginatedResolverBaseParamsSchema = {
|
|
9
9
|
page: {
|
|
10
10
|
type: "integer",
|
|
@@ -321,25 +321,26 @@ function tokenPaginatedResolver_default({ collection, params, resolve, ...otherO
|
|
|
321
321
|
}
|
|
322
322
|
|
|
323
323
|
// src/service/index.ts
|
|
324
|
-
import {
|
|
324
|
+
import { registerPendingResolver, getTargetMetadata } from "@orion-js/graphql";
|
|
325
325
|
function PaginatedQuery(options) {
|
|
326
326
|
return (method, context) => {
|
|
327
327
|
const propertyKey = String(context.name);
|
|
328
|
-
context.
|
|
329
|
-
const
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
328
|
+
if (context.kind === "method") {
|
|
329
|
+
const params = getTargetMetadata(method, propertyKey, "params") || {};
|
|
330
|
+
const returns = getTargetMetadata(method, propertyKey, "returns") || "string";
|
|
331
|
+
registerPendingResolver(
|
|
332
|
+
propertyKey,
|
|
333
|
+
(instance) => createPaginatedResolver({
|
|
334
|
+
params,
|
|
335
|
+
returns,
|
|
334
336
|
...options,
|
|
335
|
-
getCursor:
|
|
336
|
-
})
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
});
|
|
337
|
+
getCursor: instance[propertyKey].bind(instance)
|
|
338
|
+
})
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
if (context.kind === "field") {
|
|
342
|
+
registerPendingResolver(propertyKey, (instance) => instance[propertyKey]);
|
|
343
|
+
}
|
|
343
344
|
return method;
|
|
344
345
|
};
|
|
345
346
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/paginatedResolver/index.ts","../src/paginatedResolver/params.ts","../src/paginatedResolver/setOptions.ts","../src/paginatedResolver/getModel.ts","../src/tokenPaginatedResolver/index.ts","../src/tokenPaginatedResolver/getReturnModel.ts","../src/service/index.ts"],"sourcesContent":["import {createResolver, getResolverArgs, internal_schemaWithResolvers} from '@orion-js/resolvers'\nimport {getPaginatedResolverParams, paginatedResolverBaseParamsSchema} from './params'\nimport setOptions from './setOptions'\nimport {getSchemaWithMetadataFromAnyOrionForm, InferSchemaType, Schema} from '@orion-js/schema'\nimport {getPaginatedResolverResolvers, getPaginatedResolverReturnSchema} from './getModel'\n\nexport interface PaginatedCursor<TReturns extends Schema = any> {\n count?: () => Promise<number> | number\n toArray: () => Promise<InferSchemaType<TReturns>[]>\n limit?: (newLimit: number) => void\n skip?: (newSkip: number) => void\n sort?: (newSort: {[key: string]: 1 | -1}) => void\n}\n\nexport type PaginatedResolverGetCursorResultWithCount<TReturns extends Schema = any> = {\n count: () => Promise<number> | number\n cursor: PaginatedCursor<TReturns>\n}\n\nexport type PaginatedResolverGetCursorResult<TReturns extends Schema = any> =\n | PaginatedCursor<TReturns>\n | PaginatedResolverGetCursorResultWithCount<TReturns>\n\nexport interface PaginatedResolverOpts<\n TParams extends Schema = any,\n TReturns extends Schema = any,\n TViewer = any,\n> {\n returns: TReturns\n getCursor: (\n params?: InferSchemaType<typeof paginatedResolverBaseParamsSchema & TParams>,\n viewer?: TViewer,\n ) => Promise<PaginatedResolverGetCursorResult<TReturns>>\n allowedSorts?: string[]\n defaultSortBy?: string\n defaultSortType?: 'asc' | 'desc'\n params?: TParams\n modelName?: string\n /**\n * @deprecated Just check the permissions in the resolver instead\n */\n permissionsOptions?: any\n}\n\nexport function createPaginatedResolver<\n TParams extends Schema = any,\n TReturns extends Schema = any,\n TViewer = any,\n>({\n returns,\n params,\n allowedSorts,\n defaultSortBy,\n defaultSortType,\n getCursor,\n modelName,\n ...otherOptions\n}: PaginatedResolverOpts<TParams, TReturns, TViewer>) {\n const getCursorResult = async (...args) => {\n const result = await getCursor(...args)\n if ((result as PaginatedResolverGetCursorResultWithCount).cursor) {\n const resultWithCount = result as PaginatedResolverGetCursorResultWithCount\n return {cursor: resultWithCount.cursor, getCount: () => resultWithCount.count()}\n }\n const resultWithoutCount = result as PaginatedCursor\n return {cursor: resultWithoutCount, getCount: () => resultWithoutCount.count()}\n }\n\n const ReturnsModel = getSchemaWithMetadataFromAnyOrionForm(returns)\n const finalModelName = modelName || `Paginated${ReturnsModel.__modelName}`\n const paginatedParams = getPaginatedResolverParams<TParams>({\n params,\n allowedSorts,\n defaultSortBy,\n defaultSortType,\n })\n const baseReturnSchema = getPaginatedResolverReturnSchema(paginatedParams)\n const resolvers = getPaginatedResolverResolvers<TParams, TReturns>(modelName, returns)\n\n return createResolver({\n params: paginatedParams,\n returns: internal_schemaWithResolvers({\n name: finalModelName,\n schema: baseReturnSchema,\n resolvers: resolvers as any,\n }) as typeof baseReturnSchema,\n async resolve(...args) {\n const {params, viewer} = getResolverArgs(...args)\n const {cursor, getCount} = await getCursorResult(...args)\n\n /* counting the total number of elements of this cursor, so we make sure\n that it is going to be computed only once */\n const count = await getCount()\n const options = setOptions(params, cursor)\n\n return {\n cursor,\n params,\n viewer,\n options,\n count,\n }\n },\n ...otherOptions,\n })\n}\n\n/**\n * @deprecated Use createPaginatedResolver instead\n */\nexport const paginatedResolver = createPaginatedResolver\n","import {getSchemaFromAnyOrionForm, Schema} from '@orion-js/schema'\nimport {PaginatedResolverOpts} from '.'\nimport {clone} from '@orion-js/helpers'\n\n// @ts-ignore polyfill for Symbol.metadata // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#decorator-metadata\nSymbol.metadata ??= Symbol('Symbol.metadata')\n\ntype OptionsKeys = 'params' | 'allowedSorts' | 'defaultSortBy' | 'defaultSortType'\n\nexport const paginatedResolverBaseParamsSchema = {\n page: {\n type: 'integer',\n defaultValue: 1,\n optional: true,\n min: 1,\n },\n limit: {\n type: 'integer',\n defaultValue: 20,\n optional: true,\n min: 0,\n max: 200,\n },\n sortBy: {\n type: String,\n optional: true,\n },\n sortType: {\n type: String,\n allowedValues: ['asc', 'desc'],\n optional: true,\n },\n} as const\n\nexport function getPaginatedResolverParams<const TDefinedParams extends Schema>(\n options: Pick<PaginatedResolverOpts, OptionsKeys>,\n): typeof paginatedResolverBaseParamsSchema & TDefinedParams {\n const {params, allowedSorts, defaultSortBy, defaultSortType} = options\n const paramsSchema = (params ? getSchemaFromAnyOrionForm(params) : {}) as Schema\n\n const schema = clone({\n ...paginatedResolverBaseParamsSchema,\n ...(paramsSchema || {}),\n })\n\n if (allowedSorts?.length) {\n // @ts-ignore\n schema.sortBy.allowedValues = allowedSorts\n if (defaultSortBy) {\n // @ts-ignore\n schema.sortBy.defaultValue = defaultSortBy\n }\n if (defaultSortType) {\n // @ts-ignore\n schema.sortType.defaultValue = defaultSortType\n }\n } else {\n delete schema.sortBy\n delete schema.sortType\n }\n\n return schema as any\n}\n","import {PaginatedCursor} from './index'\n\nexport default function ({page, limit, sortBy, sortType}, cursor: PaginatedCursor) {\n const skip = limit * (page - 1)\n\n if (limit && cursor.limit) {\n cursor.limit(limit)\n }\n\n if (skip && cursor.skip) {\n cursor.skip(skip)\n }\n\n if (sortBy && sortType && cursor.sort) {\n cursor.sort({\n [`${sortBy}`]: sortType === 'asc' ? 1 : -1,\n })\n }\n\n return {\n skip,\n limit,\n }\n}\n","import {hashObject} from '@orion-js/helpers'\nimport {createModelResolver} from '@orion-js/resolvers'\nimport {getSchemaFromAnyOrionForm, InferSchemaType, Schema} from '@orion-js/schema'\nimport {PaginatedCursor} from '.'\n\nexport function getPaginatedResolverReturnSchema<TParams extends Schema>(paramsSchema: TParams) {\n return {\n cursor: {\n type: 'any',\n private: true,\n },\n params: {\n type: paramsSchema,\n private: true,\n },\n viewer: {\n type: 'any',\n private: true,\n },\n options: {\n type: 'any',\n private: true,\n },\n count: {\n type: 'integer',\n private: true,\n },\n } as const\n}\n\ntype PaginatedModelResolversInput<TParams extends Schema, TReturns extends Schema> = {\n cursor: PaginatedCursor<TReturns>\n params: InferSchemaType<TParams>\n viewer: any\n options: any\n count: number\n}\n\nexport function getPaginatedResolverResolvers<TParams extends Schema, TReturns extends Schema>(\n modelName: string,\n returns: TReturns,\n) {\n type Item = PaginatedModelResolversInput<TParams, TReturns>\n\n const getTotalCount = async (paginated: Item) => {\n if (typeof paginated.count === 'undefined') {\n paginated.count = await paginated.cursor.count()\n }\n return paginated.count\n }\n\n const _id = createModelResolver<Item>({\n returns: 'ID',\n async resolve(paginated, viewer): Promise<string> {\n const {params} = paginated\n return hashObject({\n modelName: modelName,\n userId: viewer.userId,\n params: params,\n })\n },\n })\n\n const totalCount = createModelResolver<Item>({\n returns: 'integer',\n resolve: getTotalCount,\n })\n\n const totalPages = createModelResolver<Item>({\n returns: 'integer',\n async resolve(paginated) {\n const count = await getTotalCount(paginated)\n if (!paginated.options.limit) return 1\n return Math.ceil(count / paginated.options.limit)\n },\n })\n\n const hasNextPage = createModelResolver<Item>({\n returns: Boolean,\n async resolve(paginated) {\n const count = await getTotalCount(paginated)\n const {skip, limit} = paginated.options\n if (!limit) return false\n return skip + limit < count\n },\n })\n\n const hasPreviousPage = createModelResolver<Item>({\n returns: Boolean,\n async resolve(paginated) {\n const count = await getTotalCount(paginated)\n const {skip} = paginated.options\n return count && skip !== 0\n },\n })\n\n const items = createModelResolver<Item>({\n returns: [getSchemaFromAnyOrionForm(returns)],\n async resolve(params) {\n const result = (await params.cursor.toArray()) as InferSchemaType<TReturns[]>\n return result\n },\n })\n\n return {\n _id,\n totalCount,\n totalPages,\n hasNextPage,\n hasPreviousPage,\n items,\n }\n}\n","import {createResolver} from '@orion-js/resolvers'\nimport getReturnModel from './getReturnModel'\nimport {getResolverArgs} from '@orion-js/resolvers'\n\nexport default function ({collection, params, resolve, ...otherOptions}) {\n /* executes the resolve function, obtaining the query that will\n be applied to the collection */\n const runResolve = async (...args: any[]) => {\n if (resolve) {\n return await resolve(...args)\n }\n return {query: {}}\n }\n\n /* This function does the query to the collection. The logic is based \n in this article:\n https://medium.com/swlh/mongodb-pagination-fast-consistent-ece2a97070f3 */\n const getCursor = async ({query, sort: sortingCriteria, limit, idOffset}) => {\n if (sortingCriteria && Object.keys(sortingCriteria).length > 1)\n throw new Error('sorting criteria supports at most one field')\n\n if (!sortingCriteria || !Object.keys(sortingCriteria).length) {\n sortingCriteria = {_id: 1}\n if (idOffset) query = {...query, _id: {$gt: idOffset}}\n } else {\n const sortingField = Object.keys(sortingCriteria)[0]\n\n sortingCriteria = {...sortingCriteria, _id: 1}\n\n if (idOffset) {\n const offsetDocument = await collection.findOne({_id: idOffset})\n\n const {[sortingField]: originalSortingFieldQuery, ...restOfQuery} = query\n\n /* Suppose the following documents, and pages with 2 elements on each page:\n [\n {_id: 1, name: 'a', v: 1},\n {_id: 2, name: 'b', v: 2},\n {_id: 3, name: 'c', v: 2},\n {_id: 4, name: 'd', v: 3},\n {_id: 5, name: 'e', v: 4},\n ]\n\n If the query results are sorted by {v: 1}, then the first page will\n contain the documents with ids 1 & 2, and the last one will be the document\n with id 2.\n In order to get the documents of the second page, we cannot get the documents\n with the sorting criteria (v) greater than the last document, because we\n would skip the document with id 3. In that case, we need to get all the\n documents where either:\n 1.- The sorting field is the same than the last one, and the _id field is greater\n 2.- The sorting field is greater than the last one.\n\n In this case, we can get the documents of the second page with the following query:\n\n {\n $or: [\n {\n v: 2,\n _id: {$gt: 2}\n },\n {\n v: {$gt: 2}\n }\n ]\n }\n\n For decreasing order it is exactly the same, but the second part of the or has\n to be changed for $lt.\n */\n const sortOperator = sortingCriteria[sortingField] === 1 ? '$gt' : '$lt'\n query = {\n $or: [\n {...restOfQuery, [sortingField]: offsetDocument[sortingField], _id: {$gt: idOffset}},\n {...query, [sortingField]: {[sortOperator]: offsetDocument[sortingField]}},\n ],\n }\n }\n }\n\n return collection.find(query).sort(sortingCriteria).limit(limit)\n }\n\n const validateQuery = async query => {\n if (typeof query === 'object') {\n const fields = Object.keys(query)\n\n fields.forEach(field => {\n if (['$or', '$expr'].includes(field)) {\n throw new Error(\"tokenPaginatedResolvers don't support $or nor $expr on query\")\n }\n\n if (typeof query[field] === 'object') validateQuery(query[field])\n else if (Array.isArray(query[field]))\n query[field].forEach(queryElement => validateQuery(queryElement))\n })\n }\n }\n\n const {modelName} = otherOptions\n\n return createResolver({\n params: {\n ...params,\n idOffset: {\n type: 'ID',\n optional: true,\n },\n limit: {\n type: 'integer',\n defaultValue: 10,\n min: 1,\n max: 200,\n },\n } as any,\n returns: getReturnModel({modelName, collection}) as any,\n async resolve(...args) {\n const {params, viewer} = getResolverArgs(...args)\n const {query, sort} = await runResolve(...args)\n\n if (!query) throw new Error(\"'query' object not found in return of resolve function\")\n\n await validateQuery(query)\n\n const cursor = await getCursor({...params, query, sort})\n\n return {\n params,\n cursor,\n viewer,\n }\n },\n ...otherOptions,\n })\n}\n","import {createModel} from '@orion-js/models'\nimport {modelResolver} from '@orion-js/resolvers'\n\nexport default ({collection, modelName}) => {\n const items = modelResolver({\n returns: [collection.model],\n async resolve(params) {\n const {cursor} = params\n return await cursor.toArray()\n },\n })\n\n return createModel({\n name: modelName || `tokenPaginated${collection.model.name}`,\n resolvers: {\n items,\n },\n })\n}\n","import {createPaginatedResolver, PaginatedResolverOpts} from '../paginatedResolver'\nimport {internalResolversMetadata, getTargetMetadata} from '@orion-js/graphql'\n\nexport interface PagiantedQueryDescriptor extends Omit<PropertyDecorator, 'value'> {\n value?: PaginatedResolverOpts['getCursor']\n}\n\nexport function PaginatedQuery(): (method: any, context: ClassFieldDecoratorContext) => any\nexport function PaginatedQuery(\n options: Omit<PaginatedResolverOpts, 'getCursor'>,\n): (method: any, context: ClassMethodDecoratorContext) => any\nexport function PaginatedQuery(options?: Omit<PaginatedResolverOpts, 'getCursor'>) {\n return (method: any, context: ClassFieldDecoratorContext | ClassMethodDecoratorContext) => {\n const propertyKey = String(context.name)\n\n context.addInitializer(function (this) {\n const resolvers = internalResolversMetadata.get(this) || {}\n\n if (context.kind === 'method') {\n resolvers[propertyKey] = createPaginatedResolver({\n params: getTargetMetadata(method, propertyKey, 'params') || {},\n returns: getTargetMetadata(method, propertyKey, 'returns') || 'string',\n ...options,\n getCursor: this[propertyKey].bind(this),\n })\n }\n\n if (context.kind === 'field') {\n resolvers[propertyKey] = this[propertyKey]\n }\n\n internalResolversMetadata.set(this, resolvers)\n })\n\n return method\n }\n}\n"],"mappings":"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","names":["getSchemaFromAnyOrionForm","params","createResolver","getResolverArgs","createResolver","params"]}
|
|
1
|
+
{"version":3,"sources":["../src/paginatedResolver/index.ts","../src/paginatedResolver/params.ts","../src/paginatedResolver/setOptions.ts","../src/paginatedResolver/getModel.ts","../src/tokenPaginatedResolver/index.ts","../src/tokenPaginatedResolver/getReturnModel.ts","../src/service/index.ts"],"sourcesContent":["import {createResolver, getResolverArgs, internal_schemaWithResolvers} from '@orion-js/resolvers'\nimport {getPaginatedResolverParams, paginatedResolverBaseParamsSchema} from './params'\nimport setOptions from './setOptions'\nimport {getSchemaWithMetadataFromAnyOrionForm, InferSchemaType, Schema} from '@orion-js/schema'\nimport {getPaginatedResolverResolvers, getPaginatedResolverReturnSchema} from './getModel'\n\nexport interface PaginatedCursor<TReturns extends Schema = any> {\n count?: () => Promise<number> | number\n toArray: () => Promise<InferSchemaType<TReturns>[]>\n limit?: (newLimit: number) => void\n skip?: (newSkip: number) => void\n sort?: (newSort: {[key: string]: 1 | -1}) => void\n}\n\nexport type PaginatedResolverGetCursorResultWithCount<TReturns extends Schema = any> = {\n count: () => Promise<number> | number\n cursor: PaginatedCursor<TReturns>\n}\n\nexport type PaginatedResolverGetCursorResult<TReturns extends Schema = any> =\n | PaginatedCursor<TReturns>\n | PaginatedResolverGetCursorResultWithCount<TReturns>\n\nexport interface PaginatedResolverOpts<\n TParams extends Schema = any,\n TReturns extends Schema = any,\n TViewer = any,\n> {\n returns: TReturns\n getCursor: (\n params?: InferSchemaType<typeof paginatedResolverBaseParamsSchema & TParams>,\n viewer?: TViewer,\n ) => Promise<PaginatedResolverGetCursorResult<TReturns>>\n allowedSorts?: string[]\n defaultSortBy?: string\n defaultSortType?: 'asc' | 'desc'\n params?: TParams\n modelName?: string\n /**\n * @deprecated Just check the permissions in the resolver instead\n */\n permissionsOptions?: any\n}\n\nexport function createPaginatedResolver<\n TParams extends Schema = any,\n TReturns extends Schema = any,\n TViewer = any,\n>({\n returns,\n params,\n allowedSorts,\n defaultSortBy,\n defaultSortType,\n getCursor,\n modelName,\n ...otherOptions\n}: PaginatedResolverOpts<TParams, TReturns, TViewer>) {\n const getCursorResult = async (...args) => {\n const result = await getCursor(...args)\n if ((result as PaginatedResolverGetCursorResultWithCount).cursor) {\n const resultWithCount = result as PaginatedResolverGetCursorResultWithCount\n return {cursor: resultWithCount.cursor, getCount: () => resultWithCount.count()}\n }\n const resultWithoutCount = result as PaginatedCursor\n return {cursor: resultWithoutCount, getCount: () => resultWithoutCount.count()}\n }\n\n const ReturnsModel = getSchemaWithMetadataFromAnyOrionForm(returns)\n const finalModelName = modelName || `Paginated${ReturnsModel.__modelName}`\n const paginatedParams = getPaginatedResolverParams<TParams>({\n params,\n allowedSorts,\n defaultSortBy,\n defaultSortType,\n })\n const baseReturnSchema = getPaginatedResolverReturnSchema(paginatedParams)\n const resolvers = getPaginatedResolverResolvers<TParams, TReturns>(modelName, returns)\n\n return createResolver({\n params: paginatedParams,\n returns: internal_schemaWithResolvers({\n name: finalModelName,\n schema: baseReturnSchema,\n resolvers: resolvers as any,\n }) as typeof baseReturnSchema,\n async resolve(...args) {\n const {params, viewer} = getResolverArgs(...args)\n const {cursor, getCount} = await getCursorResult(...args)\n\n /* counting the total number of elements of this cursor, so we make sure\n that it is going to be computed only once */\n const count = await getCount()\n const options = setOptions(params, cursor)\n\n return {\n cursor,\n params,\n viewer,\n options,\n count,\n }\n },\n ...otherOptions,\n })\n}\n\n/**\n * @deprecated Use createPaginatedResolver instead\n */\nexport const paginatedResolver = createPaginatedResolver\n","import {getSchemaFromAnyOrionForm, Schema} from '@orion-js/schema'\nimport {PaginatedResolverOpts} from '.'\nimport {clone} from '@orion-js/helpers'\n\n// @ts-ignore polyfill for Symbol.metadata // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#decorator-metadata\nSymbol.metadata ??= Symbol('Symbol.metadata')\n\ntype OptionsKeys = 'params' | 'allowedSorts' | 'defaultSortBy' | 'defaultSortType'\n\nexport const paginatedResolverBaseParamsSchema = {\n page: {\n type: 'integer',\n defaultValue: 1,\n optional: true,\n min: 1,\n },\n limit: {\n type: 'integer',\n defaultValue: 20,\n optional: true,\n min: 0,\n max: 200,\n },\n sortBy: {\n type: String,\n optional: true,\n },\n sortType: {\n type: String,\n allowedValues: ['asc', 'desc'],\n optional: true,\n },\n} as const\n\nexport function getPaginatedResolverParams<const TDefinedParams extends Schema>(\n options: Pick<PaginatedResolverOpts, OptionsKeys>,\n): typeof paginatedResolverBaseParamsSchema & TDefinedParams {\n const {params, allowedSorts, defaultSortBy, defaultSortType} = options\n const paramsSchema = (params ? getSchemaFromAnyOrionForm(params) : {}) as Schema\n\n const schema = clone({\n ...paginatedResolverBaseParamsSchema,\n ...(paramsSchema || {}),\n })\n\n if (allowedSorts?.length) {\n // @ts-ignore\n schema.sortBy.allowedValues = allowedSorts\n if (defaultSortBy) {\n // @ts-ignore\n schema.sortBy.defaultValue = defaultSortBy\n }\n if (defaultSortType) {\n // @ts-ignore\n schema.sortType.defaultValue = defaultSortType\n }\n } else {\n delete schema.sortBy\n delete schema.sortType\n }\n\n return schema as any\n}\n","import {PaginatedCursor} from './index'\n\nexport default function ({page, limit, sortBy, sortType}, cursor: PaginatedCursor) {\n const skip = limit * (page - 1)\n\n if (limit && cursor.limit) {\n cursor.limit(limit)\n }\n\n if (skip && cursor.skip) {\n cursor.skip(skip)\n }\n\n if (sortBy && sortType && cursor.sort) {\n cursor.sort({\n [`${sortBy}`]: sortType === 'asc' ? 1 : -1,\n })\n }\n\n return {\n skip,\n limit,\n }\n}\n","import {hashObject} from '@orion-js/helpers'\nimport {createModelResolver} from '@orion-js/resolvers'\nimport {getSchemaFromAnyOrionForm, InferSchemaType, Schema} from '@orion-js/schema'\nimport {PaginatedCursor} from '.'\n\nexport function getPaginatedResolverReturnSchema<TParams extends Schema>(paramsSchema: TParams) {\n return {\n cursor: {\n type: 'any',\n private: true,\n },\n params: {\n type: paramsSchema,\n private: true,\n },\n viewer: {\n type: 'any',\n private: true,\n },\n options: {\n type: 'any',\n private: true,\n },\n count: {\n type: 'integer',\n private: true,\n },\n } as const\n}\n\ntype PaginatedModelResolversInput<TParams extends Schema, TReturns extends Schema> = {\n cursor: PaginatedCursor<TReturns>\n params: InferSchemaType<TParams>\n viewer: any\n options: any\n count: number\n}\n\nexport function getPaginatedResolverResolvers<TParams extends Schema, TReturns extends Schema>(\n modelName: string,\n returns: TReturns,\n) {\n type Item = PaginatedModelResolversInput<TParams, TReturns>\n\n const getTotalCount = async (paginated: Item) => {\n if (typeof paginated.count === 'undefined') {\n paginated.count = await paginated.cursor.count()\n }\n return paginated.count\n }\n\n const _id = createModelResolver<Item>({\n returns: 'ID',\n async resolve(paginated, viewer): Promise<string> {\n const {params} = paginated\n return hashObject({\n modelName: modelName,\n userId: viewer.userId,\n params: params,\n })\n },\n })\n\n const totalCount = createModelResolver<Item>({\n returns: 'integer',\n resolve: getTotalCount,\n })\n\n const totalPages = createModelResolver<Item>({\n returns: 'integer',\n async resolve(paginated) {\n const count = await getTotalCount(paginated)\n if (!paginated.options.limit) return 1\n return Math.ceil(count / paginated.options.limit)\n },\n })\n\n const hasNextPage = createModelResolver<Item>({\n returns: Boolean,\n async resolve(paginated) {\n const count = await getTotalCount(paginated)\n const {skip, limit} = paginated.options\n if (!limit) return false\n return skip + limit < count\n },\n })\n\n const hasPreviousPage = createModelResolver<Item>({\n returns: Boolean,\n async resolve(paginated) {\n const count = await getTotalCount(paginated)\n const {skip} = paginated.options\n return count && skip !== 0\n },\n })\n\n const items = createModelResolver<Item>({\n returns: [getSchemaFromAnyOrionForm(returns)],\n async resolve(params) {\n const result = (await params.cursor.toArray()) as InferSchemaType<TReturns[]>\n return result\n },\n })\n\n return {\n _id,\n totalCount,\n totalPages,\n hasNextPage,\n hasPreviousPage,\n items,\n }\n}\n","import {createResolver} from '@orion-js/resolvers'\nimport getReturnModel from './getReturnModel'\nimport {getResolverArgs} from '@orion-js/resolvers'\n\nexport default function ({collection, params, resolve, ...otherOptions}) {\n /* executes the resolve function, obtaining the query that will\n be applied to the collection */\n const runResolve = async (...args: any[]) => {\n if (resolve) {\n return await resolve(...args)\n }\n return {query: {}}\n }\n\n /* This function does the query to the collection. The logic is based \n in this article:\n https://medium.com/swlh/mongodb-pagination-fast-consistent-ece2a97070f3 */\n const getCursor = async ({query, sort: sortingCriteria, limit, idOffset}) => {\n if (sortingCriteria && Object.keys(sortingCriteria).length > 1)\n throw new Error('sorting criteria supports at most one field')\n\n if (!sortingCriteria || !Object.keys(sortingCriteria).length) {\n sortingCriteria = {_id: 1}\n if (idOffset) query = {...query, _id: {$gt: idOffset}}\n } else {\n const sortingField = Object.keys(sortingCriteria)[0]\n\n sortingCriteria = {...sortingCriteria, _id: 1}\n\n if (idOffset) {\n const offsetDocument = await collection.findOne({_id: idOffset})\n\n const {[sortingField]: originalSortingFieldQuery, ...restOfQuery} = query\n\n /* Suppose the following documents, and pages with 2 elements on each page:\n [\n {_id: 1, name: 'a', v: 1},\n {_id: 2, name: 'b', v: 2},\n {_id: 3, name: 'c', v: 2},\n {_id: 4, name: 'd', v: 3},\n {_id: 5, name: 'e', v: 4},\n ]\n\n If the query results are sorted by {v: 1}, then the first page will\n contain the documents with ids 1 & 2, and the last one will be the document\n with id 2.\n In order to get the documents of the second page, we cannot get the documents\n with the sorting criteria (v) greater than the last document, because we\n would skip the document with id 3. In that case, we need to get all the\n documents where either:\n 1.- The sorting field is the same than the last one, and the _id field is greater\n 2.- The sorting field is greater than the last one.\n\n In this case, we can get the documents of the second page with the following query:\n\n {\n $or: [\n {\n v: 2,\n _id: {$gt: 2}\n },\n {\n v: {$gt: 2}\n }\n ]\n }\n\n For decreasing order it is exactly the same, but the second part of the or has\n to be changed for $lt.\n */\n const sortOperator = sortingCriteria[sortingField] === 1 ? '$gt' : '$lt'\n query = {\n $or: [\n {...restOfQuery, [sortingField]: offsetDocument[sortingField], _id: {$gt: idOffset}},\n {...query, [sortingField]: {[sortOperator]: offsetDocument[sortingField]}},\n ],\n }\n }\n }\n\n return collection.find(query).sort(sortingCriteria).limit(limit)\n }\n\n const validateQuery = async query => {\n if (typeof query === 'object') {\n const fields = Object.keys(query)\n\n fields.forEach(field => {\n if (['$or', '$expr'].includes(field)) {\n throw new Error(\"tokenPaginatedResolvers don't support $or nor $expr on query\")\n }\n\n if (typeof query[field] === 'object') validateQuery(query[field])\n else if (Array.isArray(query[field]))\n query[field].forEach(queryElement => validateQuery(queryElement))\n })\n }\n }\n\n const {modelName} = otherOptions\n\n return createResolver({\n params: {\n ...params,\n idOffset: {\n type: 'ID',\n optional: true,\n },\n limit: {\n type: 'integer',\n defaultValue: 10,\n min: 1,\n max: 200,\n },\n } as any,\n returns: getReturnModel({modelName, collection}) as any,\n async resolve(...args) {\n const {params, viewer} = getResolverArgs(...args)\n const {query, sort} = await runResolve(...args)\n\n if (!query) throw new Error(\"'query' object not found in return of resolve function\")\n\n await validateQuery(query)\n\n const cursor = await getCursor({...params, query, sort})\n\n return {\n params,\n cursor,\n viewer,\n }\n },\n ...otherOptions,\n })\n}\n","import {createModel} from '@orion-js/models'\nimport {modelResolver} from '@orion-js/resolvers'\n\nexport default ({collection, modelName}) => {\n const items = modelResolver({\n returns: [collection.model],\n async resolve(params) {\n const {cursor} = params\n return await cursor.toArray()\n },\n })\n\n return createModel({\n name: modelName || `tokenPaginated${collection.model.name}`,\n resolvers: {\n items,\n },\n })\n}\n","import {createPaginatedResolver, PaginatedResolverOpts} from '../paginatedResolver'\nimport {registerPendingResolver, getTargetMetadata} from '@orion-js/graphql'\n\nexport interface PagiantedQueryDescriptor extends Omit<PropertyDecorator, 'value'> {\n value?: PaginatedResolverOpts['getCursor']\n}\n\nexport function PaginatedQuery(): (method: any, context: ClassFieldDecoratorContext) => any\nexport function PaginatedQuery(\n options: Omit<PaginatedResolverOpts, 'getCursor'>,\n): (method: any, context: ClassMethodDecoratorContext) => any\nexport function PaginatedQuery(options?: Omit<PaginatedResolverOpts, 'getCursor'>) {\n return (method: any, context: ClassFieldDecoratorContext | ClassMethodDecoratorContext) => {\n const propertyKey = String(context.name)\n\n if (context.kind === 'method') {\n const params = getTargetMetadata(method, propertyKey, 'params') || {}\n const returns = getTargetMetadata(method, propertyKey, 'returns') || 'string'\n registerPendingResolver(propertyKey, (instance: any) =>\n createPaginatedResolver({\n params,\n returns,\n ...options,\n getCursor: instance[propertyKey].bind(instance),\n }),\n )\n }\n\n if (context.kind === 'field') {\n registerPendingResolver(propertyKey, (instance: any) => instance[propertyKey])\n }\n\n return method\n }\n}\n"],"mappings":"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","names":["getSchemaFromAnyOrionForm","params","createResolver","getResolverArgs","createResolver","params"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orion-js/paginated-mongodb",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.0",
|
|
4
4
|
"main": "./dist/index.cjs",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -8,25 +8,31 @@
|
|
|
8
8
|
],
|
|
9
9
|
"author": "nicolaslopezj",
|
|
10
10
|
"license": "MIT",
|
|
11
|
+
"scripts": {
|
|
12
|
+
"test": "bun test",
|
|
13
|
+
"prepare": "bun run build",
|
|
14
|
+
"clean": "rm -rf ./dist",
|
|
15
|
+
"build": "tsup",
|
|
16
|
+
"dev": "tsup --watch"
|
|
17
|
+
},
|
|
11
18
|
"dependencies": {
|
|
12
|
-
"@orion-js/helpers": "4.
|
|
13
|
-
"@orion-js/models": "4.
|
|
14
|
-
"@orion-js/resolvers": "4.
|
|
15
|
-
"@orion-js/schema": "4.
|
|
16
|
-
"@orion-js/services": "4.
|
|
17
|
-
"@orion-js/typed-model": "4.
|
|
18
|
-
"@orion-js/graphql": "4.
|
|
19
|
+
"@orion-js/helpers": "4.3.0",
|
|
20
|
+
"@orion-js/models": "4.3.0",
|
|
21
|
+
"@orion-js/resolvers": "4.3.0",
|
|
22
|
+
"@orion-js/schema": "4.3.0",
|
|
23
|
+
"@orion-js/services": "4.3.0",
|
|
24
|
+
"@orion-js/typed-model": "4.3.0",
|
|
25
|
+
"@orion-js/graphql": "4.3.0"
|
|
19
26
|
},
|
|
20
27
|
"peerDependencies": {
|
|
21
|
-
"@orion-js/logger": "4.
|
|
22
|
-
"@orion-js/mongodb": "4.
|
|
28
|
+
"@orion-js/logger": "4.3.0",
|
|
29
|
+
"@orion-js/mongodb": "4.3.0"
|
|
23
30
|
},
|
|
24
31
|
"devDependencies": {
|
|
32
|
+
"@orion-js/mongodb": "4.3.0",
|
|
25
33
|
"@types/node": "^18.0.0",
|
|
26
34
|
"tsup": "^8.0.1",
|
|
27
|
-
"typescript": "^5.4.5"
|
|
28
|
-
"vitest": "^3.0.8",
|
|
29
|
-
"@orion-js/mongodb": "4.2.10"
|
|
35
|
+
"typescript": "^5.4.5"
|
|
30
36
|
},
|
|
31
37
|
"publishConfig": {
|
|
32
38
|
"access": "public"
|
|
@@ -38,12 +44,5 @@
|
|
|
38
44
|
"types": "./dist/index.d.ts",
|
|
39
45
|
"import": "./dist/index.js",
|
|
40
46
|
"require": "./dist/index.cjs"
|
|
41
|
-
},
|
|
42
|
-
"scripts": {
|
|
43
|
-
"test": "vitest run",
|
|
44
|
-
"clean": "rm -rf ./dist",
|
|
45
|
-
"build": "tsup",
|
|
46
|
-
"upgrade-interactive": "pnpm upgrade --interactive",
|
|
47
|
-
"dev": "tsup --watch"
|
|
48
47
|
}
|
|
49
|
-
}
|
|
48
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2022 Orionjs Team
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|