@orion-js/paginated-mongodb 4.0.0-next.8 → 4.0.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 CHANGED
@@ -36,11 +36,13 @@ var paginatedResolverBaseParamsSchema = {
36
36
  page: {
37
37
  type: "integer",
38
38
  defaultValue: 1,
39
+ optional: true,
39
40
  min: 1
40
41
  },
41
42
  limit: {
42
43
  type: "integer",
43
44
  defaultValue: 0,
45
+ optional: true,
44
46
  min: 0,
45
47
  max: 200
46
48
  },
@@ -70,8 +72,8 @@ function getPaginatedResolverParams(options) {
70
72
  schema.sortType.defaultValue = defaultSortType;
71
73
  }
72
74
  } else {
73
- schema.sortBy = void 0;
74
- schema.sortType = void 0;
75
+ delete schema.sortBy;
76
+ delete schema.sortType;
75
77
  }
76
78
  return schema;
77
79
  }
@@ -97,11 +99,12 @@ function setOptions_default({ page, limit, sortBy, sortType }, cursor) {
97
99
  }
98
100
 
99
101
  // src/paginatedResolver/index.ts
100
- var import_schema2 = require("@orion-js/schema");
102
+ var import_schema3 = require("@orion-js/schema");
101
103
 
102
104
  // src/paginatedResolver/getModel.ts
103
105
  var import_helpers = require("@orion-js/helpers");
104
106
  var import_resolvers = require("@orion-js/resolvers");
107
+ var import_schema2 = require("@orion-js/schema");
105
108
  function getPaginatedResolverReturnSchema(paramsSchema) {
106
109
  return {
107
110
  cursor: {
@@ -174,9 +177,9 @@ function getPaginatedResolverResolvers(modelName, returns) {
174
177
  }
175
178
  });
176
179
  const items = (0, import_resolvers.createModelResolver)({
177
- returns: [returns],
178
- async resolve({ cursor }) {
179
- const result = await cursor.toArray();
180
+ returns: [(0, import_schema2.getSchemaFromAnyOrionForm)(returns)],
181
+ async resolve(params) {
182
+ const result = await params.cursor.toArray();
180
183
  return result;
181
184
  }
182
185
  });
@@ -210,7 +213,7 @@ function createPaginatedResolver({
210
213
  const resultWithoutCount = result;
211
214
  return { cursor: resultWithoutCount, getCount: () => resultWithoutCount.count() };
212
215
  };
213
- const ReturnsModel = (0, import_schema2.getSchemaWithMetadataFromAnyOrionForm)(returns);
216
+ const ReturnsModel = (0, import_schema3.getSchemaWithMetadataFromAnyOrionForm)(returns);
214
217
  const finalModelName = modelName || `Paginated${ReturnsModel.__modelName}`;
215
218
  const paginatedParams = getPaginatedResolverParams({
216
219
  params,
@@ -345,18 +348,26 @@ function tokenPaginatedResolver_default({ collection, params, resolve, ...otherO
345
348
  }
346
349
 
347
350
  // src/service/index.ts
348
- var import_services = require("@orion-js/services");
351
+ var import_graphql = require("@orion-js/graphql");
349
352
  function PaginatedQuery(options) {
350
- return (target, propertyKey, descriptor) => {
351
- if (!descriptor.value) throw new Error(`You must pass resolver function to ${propertyKey}`);
352
- target.resolvers = target.resolvers || {};
353
- target.resolvers[propertyKey] = paginatedResolver({
354
- ...options,
355
- getCursor: async (params, viewer) => {
356
- const instance = (0, import_services.getInstance)(target.service);
357
- return await instance[propertyKey](params, viewer);
353
+ return (method, context) => {
354
+ const propertyKey = String(context.name);
355
+ context.addInitializer(function() {
356
+ const resolvers = import_graphql.internalResolversMetadata.get(this) || {};
357
+ if (context.kind === "method") {
358
+ resolvers[propertyKey] = createPaginatedResolver({
359
+ params: (0, import_graphql.getTargetMetadata)(method, propertyKey, "params") || {},
360
+ returns: (0, import_graphql.getTargetMetadata)(method, propertyKey, "returns") || "string",
361
+ ...options,
362
+ getCursor: this[propertyKey].bind(this)
363
+ });
364
+ }
365
+ if (context.kind === "field") {
366
+ resolvers[propertyKey] = this[propertyKey];
358
367
  }
368
+ import_graphql.internalResolversMetadata.set(this, resolvers);
359
369
  });
370
+ return method;
360
371
  };
361
372
  }
362
373
  // Annotate the CommonJS export names for ESM import in node:
@@ -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 = Schema> {\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 = Schema> = {\n count: () => Promise<number> | number\n cursor: PaginatedCursor<TReturns>\n}\n\nexport type PaginatedResolverGetCursorResult<TReturns extends Schema = Schema> =\n | PaginatedCursor<TReturns>\n | PaginatedResolverGetCursorResultWithCount<TReturns>\n\nexport interface PaginatedResolverOpts<\n TParams extends Schema = Schema,\n TReturns extends Schema = Schema,\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 = Schema,\n TReturns extends Schema = Schema,\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 '.'\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 min: 1,\n },\n limit: {\n type: 'integer',\n defaultValue: 0,\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) : {}\n\n const schema = {\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 schema.sortBy = undefined\n schema.sortType = undefined\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 {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: [returns],\n async resolve({cursor}) {\n const result = (await 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 {paginatedResolver} from '..'\nimport {PaginatedResolverOpts} from '../paginatedResolver'\nimport {getInstance} from '@orion-js/services'\n\nexport interface PagiantedQueryDescriptor extends Omit<PropertyDecorator, 'value'> {\n value?: PaginatedResolverOpts['getCursor']\n}\n\nexport function PaginatedQuery(options: Omit<PaginatedResolverOpts, 'getCursor'>) {\n return (target: any, propertyKey: string, descriptor: PagiantedQueryDescriptor) => {\n if (!descriptor.value) throw new Error(`You must pass resolver function to ${propertyKey}`)\n\n target.resolvers = target.resolvers || {}\n target.resolvers[propertyKey] = paginatedResolver({\n ...options,\n getCursor: async (params, viewer) => {\n const instance: any = getInstance(target.service)\n return await instance[propertyKey](params, viewer)\n },\n })\n }\n}\n"],"mappings":"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","names":["import_resolvers","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 '.'\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: 0,\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 = {\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":["import_resolvers","import_schema","import_schema","params","import_resolvers","import_resolvers","import_resolvers","params"]}
package/dist/index.d.cts CHANGED
@@ -5,11 +5,13 @@ declare const paginatedResolverBaseParamsSchema: {
5
5
  readonly page: {
6
6
  readonly type: "integer";
7
7
  readonly defaultValue: 1;
8
+ readonly optional: true;
8
9
  readonly min: 1;
9
10
  };
10
11
  readonly limit: {
11
12
  readonly type: "integer";
12
13
  readonly defaultValue: 0;
14
+ readonly optional: true;
13
15
  readonly min: 0;
14
16
  readonly max: 200;
15
17
  };
@@ -24,7 +26,7 @@ declare const paginatedResolverBaseParamsSchema: {
24
26
  };
25
27
  };
26
28
 
27
- interface PaginatedCursor<TReturns extends Schema = Schema> {
29
+ interface PaginatedCursor<TReturns extends Schema = any> {
28
30
  count?: () => Promise<number> | number;
29
31
  toArray: () => Promise<InferSchemaType<TReturns>[]>;
30
32
  limit?: (newLimit: number) => void;
@@ -33,12 +35,12 @@ interface PaginatedCursor<TReturns extends Schema = Schema> {
33
35
  [key: string]: 1 | -1;
34
36
  }) => void;
35
37
  }
36
- type PaginatedResolverGetCursorResultWithCount<TReturns extends Schema = Schema> = {
38
+ type PaginatedResolverGetCursorResultWithCount<TReturns extends Schema = any> = {
37
39
  count: () => Promise<number> | number;
38
40
  cursor: PaginatedCursor<TReturns>;
39
41
  };
40
- type PaginatedResolverGetCursorResult<TReturns extends Schema = Schema> = PaginatedCursor<TReturns> | PaginatedResolverGetCursorResultWithCount<TReturns>;
41
- interface PaginatedResolverOpts<TParams extends Schema = Schema, TReturns extends Schema = Schema, TViewer = any> {
42
+ type PaginatedResolverGetCursorResult<TReturns extends Schema = any> = PaginatedCursor<TReturns> | PaginatedResolverGetCursorResultWithCount<TReturns>;
43
+ interface PaginatedResolverOpts<TParams extends Schema = any, TReturns extends Schema = any, TViewer = any> {
42
44
  returns: TReturns;
43
45
  getCursor: (params?: InferSchemaType<typeof paginatedResolverBaseParamsSchema & TParams>, viewer?: TViewer) => Promise<PaginatedResolverGetCursorResult<TReturns>>;
44
46
  allowedSorts?: string[];
@@ -51,15 +53,17 @@ interface PaginatedResolverOpts<TParams extends Schema = Schema, TReturns extend
51
53
  */
52
54
  permissionsOptions?: any;
53
55
  }
54
- declare function createPaginatedResolver<TParams extends Schema = Schema, TReturns extends Schema = Schema, TViewer = any>({ returns, params, allowedSorts, defaultSortBy, defaultSortType, getCursor, modelName, ...otherOptions }: PaginatedResolverOpts<TParams, TReturns, TViewer>): _orion_js_resolvers.Resolver<_orion_js_resolvers.GlobalResolverResolve<{
56
+ declare function createPaginatedResolver<TParams extends Schema = any, TReturns extends Schema = any, TViewer = any>({ returns, params, allowedSorts, defaultSortBy, defaultSortType, getCursor, modelName, ...otherOptions }: PaginatedResolverOpts<TParams, TReturns, TViewer>): _orion_js_resolvers.GlobalResolver<{
55
57
  readonly page: {
56
58
  readonly type: "integer";
57
59
  readonly defaultValue: 1;
60
+ readonly optional: true;
58
61
  readonly min: 1;
59
62
  };
60
63
  readonly limit: {
61
64
  readonly type: "integer";
62
65
  readonly defaultValue: 0;
66
+ readonly optional: true;
63
67
  readonly min: 0;
64
68
  readonly max: 200;
65
69
  };
@@ -82,11 +86,13 @@ declare function createPaginatedResolver<TParams extends Schema = Schema, TRetur
82
86
  readonly page: {
83
87
  readonly type: "integer";
84
88
  readonly defaultValue: 1;
89
+ readonly optional: true;
85
90
  readonly min: 1;
86
91
  };
87
92
  readonly limit: {
88
93
  readonly type: "integer";
89
94
  readonly defaultValue: 0;
95
+ readonly optional: true;
90
96
  readonly min: 0;
91
97
  readonly max: 200;
92
98
  };
@@ -114,7 +120,7 @@ declare function createPaginatedResolver<TParams extends Schema = Schema, TRetur
114
120
  readonly type: "integer";
115
121
  readonly private: true;
116
122
  };
117
- }, any, any>, undefined>;
123
+ }, any, any>;
118
124
  /**
119
125
  * @deprecated Use createPaginatedResolver instead
120
126
  */
@@ -125,11 +131,12 @@ declare function export_default({ collection, params, resolve, ...otherOptions }
125
131
  collection: any;
126
132
  params: any;
127
133
  resolve: any;
128
- }): _orion_js_resolvers.Resolver<_orion_js_resolvers.GlobalResolverResolve<any, any, any, any>, undefined>;
134
+ }): _orion_js_resolvers.GlobalResolver<any, any, any, any>;
129
135
 
130
136
  interface PagiantedQueryDescriptor extends Omit<PropertyDecorator, 'value'> {
131
137
  value?: PaginatedResolverOpts['getCursor'];
132
138
  }
133
- declare function PaginatedQuery(options: Omit<PaginatedResolverOpts, 'getCursor'>): (target: any, propertyKey: string, descriptor: PagiantedQueryDescriptor) => void;
139
+ declare function PaginatedQuery(): (method: any, context: ClassFieldDecoratorContext) => any;
140
+ declare function PaginatedQuery(options: Omit<PaginatedResolverOpts, 'getCursor'>): (method: any, context: ClassMethodDecoratorContext) => any;
134
141
 
135
142
  export { type PagiantedQueryDescriptor, PaginatedQuery, createPaginatedResolver, paginatedResolver, export_default as tokenPaginatedResolver };
package/dist/index.d.ts CHANGED
@@ -5,11 +5,13 @@ declare const paginatedResolverBaseParamsSchema: {
5
5
  readonly page: {
6
6
  readonly type: "integer";
7
7
  readonly defaultValue: 1;
8
+ readonly optional: true;
8
9
  readonly min: 1;
9
10
  };
10
11
  readonly limit: {
11
12
  readonly type: "integer";
12
13
  readonly defaultValue: 0;
14
+ readonly optional: true;
13
15
  readonly min: 0;
14
16
  readonly max: 200;
15
17
  };
@@ -24,7 +26,7 @@ declare const paginatedResolverBaseParamsSchema: {
24
26
  };
25
27
  };
26
28
 
27
- interface PaginatedCursor<TReturns extends Schema = Schema> {
29
+ interface PaginatedCursor<TReturns extends Schema = any> {
28
30
  count?: () => Promise<number> | number;
29
31
  toArray: () => Promise<InferSchemaType<TReturns>[]>;
30
32
  limit?: (newLimit: number) => void;
@@ -33,12 +35,12 @@ interface PaginatedCursor<TReturns extends Schema = Schema> {
33
35
  [key: string]: 1 | -1;
34
36
  }) => void;
35
37
  }
36
- type PaginatedResolverGetCursorResultWithCount<TReturns extends Schema = Schema> = {
38
+ type PaginatedResolverGetCursorResultWithCount<TReturns extends Schema = any> = {
37
39
  count: () => Promise<number> | number;
38
40
  cursor: PaginatedCursor<TReturns>;
39
41
  };
40
- type PaginatedResolverGetCursorResult<TReturns extends Schema = Schema> = PaginatedCursor<TReturns> | PaginatedResolverGetCursorResultWithCount<TReturns>;
41
- interface PaginatedResolverOpts<TParams extends Schema = Schema, TReturns extends Schema = Schema, TViewer = any> {
42
+ type PaginatedResolverGetCursorResult<TReturns extends Schema = any> = PaginatedCursor<TReturns> | PaginatedResolverGetCursorResultWithCount<TReturns>;
43
+ interface PaginatedResolverOpts<TParams extends Schema = any, TReturns extends Schema = any, TViewer = any> {
42
44
  returns: TReturns;
43
45
  getCursor: (params?: InferSchemaType<typeof paginatedResolverBaseParamsSchema & TParams>, viewer?: TViewer) => Promise<PaginatedResolverGetCursorResult<TReturns>>;
44
46
  allowedSorts?: string[];
@@ -51,15 +53,17 @@ interface PaginatedResolverOpts<TParams extends Schema = Schema, TReturns extend
51
53
  */
52
54
  permissionsOptions?: any;
53
55
  }
54
- declare function createPaginatedResolver<TParams extends Schema = Schema, TReturns extends Schema = Schema, TViewer = any>({ returns, params, allowedSorts, defaultSortBy, defaultSortType, getCursor, modelName, ...otherOptions }: PaginatedResolverOpts<TParams, TReturns, TViewer>): _orion_js_resolvers.Resolver<_orion_js_resolvers.GlobalResolverResolve<{
56
+ declare function createPaginatedResolver<TParams extends Schema = any, TReturns extends Schema = any, TViewer = any>({ returns, params, allowedSorts, defaultSortBy, defaultSortType, getCursor, modelName, ...otherOptions }: PaginatedResolverOpts<TParams, TReturns, TViewer>): _orion_js_resolvers.GlobalResolver<{
55
57
  readonly page: {
56
58
  readonly type: "integer";
57
59
  readonly defaultValue: 1;
60
+ readonly optional: true;
58
61
  readonly min: 1;
59
62
  };
60
63
  readonly limit: {
61
64
  readonly type: "integer";
62
65
  readonly defaultValue: 0;
66
+ readonly optional: true;
63
67
  readonly min: 0;
64
68
  readonly max: 200;
65
69
  };
@@ -82,11 +86,13 @@ declare function createPaginatedResolver<TParams extends Schema = Schema, TRetur
82
86
  readonly page: {
83
87
  readonly type: "integer";
84
88
  readonly defaultValue: 1;
89
+ readonly optional: true;
85
90
  readonly min: 1;
86
91
  };
87
92
  readonly limit: {
88
93
  readonly type: "integer";
89
94
  readonly defaultValue: 0;
95
+ readonly optional: true;
90
96
  readonly min: 0;
91
97
  readonly max: 200;
92
98
  };
@@ -114,7 +120,7 @@ declare function createPaginatedResolver<TParams extends Schema = Schema, TRetur
114
120
  readonly type: "integer";
115
121
  readonly private: true;
116
122
  };
117
- }, any, any>, undefined>;
123
+ }, any, any>;
118
124
  /**
119
125
  * @deprecated Use createPaginatedResolver instead
120
126
  */
@@ -125,11 +131,12 @@ declare function export_default({ collection, params, resolve, ...otherOptions }
125
131
  collection: any;
126
132
  params: any;
127
133
  resolve: any;
128
- }): _orion_js_resolvers.Resolver<_orion_js_resolvers.GlobalResolverResolve<any, any, any, any>, undefined>;
134
+ }): _orion_js_resolvers.GlobalResolver<any, any, any, any>;
129
135
 
130
136
  interface PagiantedQueryDescriptor extends Omit<PropertyDecorator, 'value'> {
131
137
  value?: PaginatedResolverOpts['getCursor'];
132
138
  }
133
- declare function PaginatedQuery(options: Omit<PaginatedResolverOpts, 'getCursor'>): (target: any, propertyKey: string, descriptor: PagiantedQueryDescriptor) => void;
139
+ declare function PaginatedQuery(): (method: any, context: ClassFieldDecoratorContext) => any;
140
+ declare function PaginatedQuery(options: Omit<PaginatedResolverOpts, 'getCursor'>): (method: any, context: ClassMethodDecoratorContext) => any;
134
141
 
135
142
  export { type PagiantedQueryDescriptor, PaginatedQuery, createPaginatedResolver, paginatedResolver, export_default as tokenPaginatedResolver };
package/dist/index.js CHANGED
@@ -8,11 +8,13 @@ var paginatedResolverBaseParamsSchema = {
8
8
  page: {
9
9
  type: "integer",
10
10
  defaultValue: 1,
11
+ optional: true,
11
12
  min: 1
12
13
  },
13
14
  limit: {
14
15
  type: "integer",
15
16
  defaultValue: 0,
17
+ optional: true,
16
18
  min: 0,
17
19
  max: 200
18
20
  },
@@ -42,8 +44,8 @@ function getPaginatedResolverParams(options) {
42
44
  schema.sortType.defaultValue = defaultSortType;
43
45
  }
44
46
  } else {
45
- schema.sortBy = void 0;
46
- schema.sortType = void 0;
47
+ delete schema.sortBy;
48
+ delete schema.sortType;
47
49
  }
48
50
  return schema;
49
51
  }
@@ -74,6 +76,7 @@ import { getSchemaWithMetadataFromAnyOrionForm } from "@orion-js/schema";
74
76
  // src/paginatedResolver/getModel.ts
75
77
  import { hashObject } from "@orion-js/helpers";
76
78
  import { createModelResolver } from "@orion-js/resolvers";
79
+ import { getSchemaFromAnyOrionForm as getSchemaFromAnyOrionForm2 } from "@orion-js/schema";
77
80
  function getPaginatedResolverReturnSchema(paramsSchema) {
78
81
  return {
79
82
  cursor: {
@@ -146,9 +149,9 @@ function getPaginatedResolverResolvers(modelName, returns) {
146
149
  }
147
150
  });
148
151
  const items = createModelResolver({
149
- returns: [returns],
150
- async resolve({ cursor }) {
151
- const result = await cursor.toArray();
152
+ returns: [getSchemaFromAnyOrionForm2(returns)],
153
+ async resolve(params) {
154
+ const result = await params.cursor.toArray();
152
155
  return result;
153
156
  }
154
157
  });
@@ -317,18 +320,26 @@ function tokenPaginatedResolver_default({ collection, params, resolve, ...otherO
317
320
  }
318
321
 
319
322
  // src/service/index.ts
320
- import { getInstance } from "@orion-js/services";
323
+ import { internalResolversMetadata, getTargetMetadata } from "@orion-js/graphql";
321
324
  function PaginatedQuery(options) {
322
- return (target, propertyKey, descriptor) => {
323
- if (!descriptor.value) throw new Error(`You must pass resolver function to ${propertyKey}`);
324
- target.resolvers = target.resolvers || {};
325
- target.resolvers[propertyKey] = paginatedResolver({
326
- ...options,
327
- getCursor: async (params, viewer) => {
328
- const instance = getInstance(target.service);
329
- return await instance[propertyKey](params, viewer);
325
+ return (method, context) => {
326
+ const propertyKey = String(context.name);
327
+ context.addInitializer(function() {
328
+ const resolvers = internalResolversMetadata.get(this) || {};
329
+ if (context.kind === "method") {
330
+ resolvers[propertyKey] = createPaginatedResolver({
331
+ params: getTargetMetadata(method, propertyKey, "params") || {},
332
+ returns: getTargetMetadata(method, propertyKey, "returns") || "string",
333
+ ...options,
334
+ getCursor: this[propertyKey].bind(this)
335
+ });
336
+ }
337
+ if (context.kind === "field") {
338
+ resolvers[propertyKey] = this[propertyKey];
330
339
  }
340
+ internalResolversMetadata.set(this, resolvers);
331
341
  });
342
+ return method;
332
343
  };
333
344
  }
334
345
  export {
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 = Schema> {\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 = Schema> = {\n count: () => Promise<number> | number\n cursor: PaginatedCursor<TReturns>\n}\n\nexport type PaginatedResolverGetCursorResult<TReturns extends Schema = Schema> =\n | PaginatedCursor<TReturns>\n | PaginatedResolverGetCursorResultWithCount<TReturns>\n\nexport interface PaginatedResolverOpts<\n TParams extends Schema = Schema,\n TReturns extends Schema = Schema,\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 = Schema,\n TReturns extends Schema = Schema,\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 '.'\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 min: 1,\n },\n limit: {\n type: 'integer',\n defaultValue: 0,\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) : {}\n\n const schema = {\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 schema.sortBy = undefined\n schema.sortType = undefined\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 {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: [returns],\n async resolve({cursor}) {\n const result = (await 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 {paginatedResolver} from '..'\nimport {PaginatedResolverOpts} from '../paginatedResolver'\nimport {getInstance} from '@orion-js/services'\n\nexport interface PagiantedQueryDescriptor extends Omit<PropertyDecorator, 'value'> {\n value?: PaginatedResolverOpts['getCursor']\n}\n\nexport function PaginatedQuery(options: Omit<PaginatedResolverOpts, 'getCursor'>) {\n return (target: any, propertyKey: string, descriptor: PagiantedQueryDescriptor) => {\n if (!descriptor.value) throw new Error(`You must pass resolver function to ${propertyKey}`)\n\n target.resolvers = target.resolvers || {}\n target.resolvers[propertyKey] = paginatedResolver({\n ...options,\n getCursor: async (params, viewer) => {\n const instance: any = getInstance(target.service)\n return await instance[propertyKey](params, viewer)\n },\n })\n }\n}\n"],"mappings":"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","names":["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 '.'\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: 0,\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 = {\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orion-js/paginated-mongodb",
3
- "version": "4.0.0-next.8",
3
+ "version": "4.0.0",
4
4
  "main": "./dist/index.cjs",
5
5
  "types": "./dist/index.d.ts",
6
6
  "files": [
@@ -9,13 +9,14 @@
9
9
  "author": "nicolaslopezj",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@orion-js/helpers": "4.0.0-next.8",
13
- "@orion-js/mongodb": "4.0.0-next.8",
14
- "@orion-js/models": "4.0.0-next.8",
15
- "@orion-js/resolvers": "4.0.0-next.8",
16
- "@orion-js/schema": "4.0.0-next.7",
17
- "@orion-js/services": "4.0.0-next.8",
18
- "@orion-js/typed-model": "4.0.0-next.8"
12
+ "@orion-js/models": "4.0.0",
13
+ "@orion-js/resolvers": "4.0.0",
14
+ "@orion-js/services": "4.0.0",
15
+ "@orion-js/schema": "4.0.0",
16
+ "@orion-js/graphql": "4.0.0",
17
+ "@orion-js/helpers": "4.0.0",
18
+ "@orion-js/typed-model": "4.0.0",
19
+ "@orion-js/mongodb": "4.0.0"
19
20
  },
20
21
  "devDependencies": {
21
22
  "@types/node": "^18.0.0",