@r5v/mongoose-paginate 1.0.15 → 1.0.17

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/README.md CHANGED
@@ -6,6 +6,11 @@ Simple, Fast, Efficient
6
6
 
7
7
  This project was designed to accomodate more than 80% of your daily workflow to remove the overhead of boilerplate code in handling each endpoint and keeping queries and query params simple. We didn't want you to have to learn a new language to use this product
8
8
 
9
+ ## Requirements
10
+ - Node.js >= 20
11
+ - mongoose >= 8.0.0 (peer dependency)
12
+ - Tested with: 8.16.0, 9.1.4
13
+
9
14
  ## Basic Usage
10
15
 
11
16
  ### PagingQuery
@@ -307,6 +312,10 @@ $ yarn run start
307
312
  9. Apply pagination (`$skip`, `$limit`) and options
308
313
 
309
314
 
315
+ ### 1.0.17
316
+ - **Moved mongoose to peerDependencies** - Reduces bundle size for consumers who already have mongoose installed
317
+ - Supports mongoose >= 8.0.0 (tested with 8.16.0 and 9.1.4)
318
+
310
319
  ### 1.0.15
311
320
  - **Re-enabled `removeProtected` option** for `AggregationPagingQuery` (EXPERIMENTAL) - Automatically excludes fields marked with `select: false` in your schema (e.g., passwords, secret keys) from aggregation results. Use with caution and test thoroughly in your environment.
312
321
  - Uses refactored `findProtectedPaths` utility which safely traverses schemas without JSON serialization
package/dist/README.md ADDED
@@ -0,0 +1,357 @@
1
+
2
+
3
+ @r5v/mongoose-pagination is a powerful yet lightweight utility that bridges the gap between HTTP query parameters and MongoDB queries. It provides an intuitive wrapper around Mongoose models, allowing you to easily transform Express request objects into sophisticated database queries with pagination, filtering, and sorting capabilities.
4
+
5
+ Simple, Fast, Efficient
6
+
7
+ This project was designed to accomodate more than 80% of your daily workflow to remove the overhead of boilerplate code in handling each endpoint and keeping queries and query params simple. We didn't want you to have to learn a new language to use this product
8
+
9
+ ## Requirements
10
+ - Node.js >= 20
11
+ - mongoose >= 8.0.0 (peer dependency)
12
+ - Tested with: 8.16.0, 9.1.4
13
+
14
+ ## Basic Usage
15
+
16
+ ### PagingQuery
17
+ ```typescript
18
+ // userController.ts
19
+ import {PagingQuery} from '@r5v/mongoose-paginate'
20
+ import {UserModel} from "./models"
21
+
22
+ const getUsersController: RequestHandler = async (res, res) => {
23
+
24
+ const query = new PagingQuery(req, User, {})
25
+ const users = await query.exec()
26
+
27
+ res.send(users)
28
+ }
29
+ ```
30
+
31
+ #### Results
32
+
33
+ ```
34
+ {
35
+ totalRows: 0,
36
+ rows: 0,
37
+ limit: 25,
38
+ skip: 0,
39
+ items: [ <UserObject>]
40
+ }
41
+ ```
42
+
43
+ ### AggregationPagingQuery
44
+ ```typescript
45
+ // userController.ts
46
+ import {AggregationPagingQuery} from '@r5v/mongoose-paginate'
47
+ import {UserModel} from "./models"
48
+
49
+ const getUsersController: RequestHandler = async (res, res) => {
50
+
51
+ const query = new AggregationPagingQuery(req, User, {
52
+ pipeline: [ {$match:{name:/^Steve/}}]
53
+ })
54
+ const users = await query.exec()
55
+
56
+ res.send(users)
57
+ }
58
+ ```
59
+
60
+ #### Results
61
+
62
+ ```
63
+ {
64
+ totalRows: 0,
65
+ rows: 0,
66
+ limit: 25,
67
+ skip: 0,
68
+ items: [ <UserObject>]
69
+ }
70
+ ```
71
+
72
+ ### Definition
73
+
74
+ PagingQuery(Express.Request, mongoose.Model, options )
75
+
76
+ #### Query Parameters
77
+
78
+ | Name | Value | Description | Class Availability |
79
+ |:------------|:----------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------|
80
+ | $filter | Mongo Filter Object | any json string can be passed in this parameter. be sure to turn on sanitizeFilter if you allow dynamic filters | PagingQuery, AggregationPagingQuery |
81
+ | $limit | number | limit the number of returned objects | PagingQuery, AggregationPagingQuery |
82
+ | $skip | number | skip to the next object on the request | PagingQuery, AggregationPagingQuery |
83
+ | $paging | 'false'\|0\|'no' | turn off paging, on by default | PagingQuery, AggregationPagingQuery |
84
+ | $populate | comma separated dot notation string \n books,publishers | using refs and virtuals, a dot notation string will populate the model using .populate. will deep populate and select using \"authors\[name\].books\[title\],publishers\[name\]" notation | PagingQuery |
85
+ | $select | comma separated dot notation string \n books,-_id \| -_id,-name,address.-address1 | using the select notation uses the mongoose name \| -name syntax to filter the output. use this in conjunction with the $populate query to filter keys \n ie books.title,books.publisher \| -name,books.-title | PagingQuery, AggregationPagingQuery |
86
+ | $lean | no value needed, this will return a lean query result | returns a lean result. does not require a value | PagingQuery |
87
+ | $sort | space separated mongoose sort string \n name -value | inserts sort into the query. In aggregation queries this will insert a sort after the existing pipeline | PagingQuery, AggregationPagingQuery |
88
+ | $preSort | comma separated dot notation string \n books,-_id \| -_id,-name,address.-address1 | in aggregate queries this will insert a sort object after the initial match in the pipeline. | AggregationPagingQuery |
89
+ | $count | comma separated dot notation string | this comma separate string will traverse the results and insert a new field with the $size of the selected key/value . this new name field will be appended with `_count` | AggregationPagingQuery |
90
+ | $postFilter | Any Json Object | creates and additional filter and in aggregation queries is appended to the end of the pipeline | AggregationPagingQuery |
91
+
92
+ #### Example URLs
93
+
94
+ ```bash
95
+ # Basic pagination
96
+ GET /api/books?$limit=10&$skip=20
97
+
98
+ # Filter by field (JSON format)
99
+ GET /api/books?$filter={"genre":"Horror"}
100
+
101
+ # Filter with operators
102
+ GET /api/books?$filter={"price.amount":{"$gte":20,"$lte":50}}
103
+
104
+ # Sort (space-separated: field direction)
105
+ GET /api/books?$sort=price.amount%20desc
106
+ GET /api/books?$sort=title%20asc,createdAt%20desc
107
+
108
+ # Select specific fields
109
+ GET /api/books?$select=title,isbn,price
110
+
111
+ # Populate references
112
+ GET /api/books?$populate=author,publisher
113
+
114
+ # Deep populate with field selection
115
+ GET /api/books?$populate=author[firstName,lastName],publisher[name]
116
+
117
+ # Aggregation with preSort (sorts before pipeline)
118
+ GET /api/books?$preSort=createdAt%20desc
119
+
120
+ # Aggregation with postFilter (filters on computed fields)
121
+ GET /api/books?$postFilter={"priceCategory":"expensive"}
122
+
123
+ # Count array fields
124
+ GET /api/books?$count=authors,tags
125
+ # Result includes: authors_count, tags_count
126
+
127
+ # Disable paging (returns array instead of paged object)
128
+ GET /api/books?$paging=false
129
+
130
+ # Lean query (returns plain objects)
131
+ GET /api/books?$lean=true
132
+ ```
133
+
134
+ #### Options
135
+
136
+ | Key | Value | Description | Class Availability | Required | Default |
137
+ |:----------------------------|:---------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:------------------------------------|:---------|:--------|
138
+ | disablePaging | boolean | disables paging and $paging param use | PagingQuery, AggregationPagingQuery | | false |
139
+ | disableFilter | boolean | disables the $filter param on req. | PagingQuery | | false |
140
+ | enableFilter | boolean | enables the $filter param on req for aggregation queries. | AggregationPagingQuery | | false |
141
+ | enablePreSort | boolean | enables the $preSort param on req for aggregation queries. | AggregationPagingQuery | | false |
142
+ | single | boolean | disables paging on the query. converts from .find query to .findOne() | PagingQuery | | false |
143
+ | enablePostFilter | boolean | enables the ability to create a dynamic filter per request using the $postFilter parameter | AggregationPagingQuery | | false |
144
+ | staticPostFilter | Mongo Filter Object | create a filter on the pipeline that is added after all the pipeline stages. this cannot be overwritten by params | AggregationPagingQuery | | {} |
145
+ | staticFilter | Mongo Filter Object | create a filter on the pipeline that is added before all the pipeline stages. on find requests, this is added to the filter object. this cannot be overwritten by params | AggregationPagingQuery | | {} |
146
+ | pipeline | MongoPipelineStage[] | pipeline request object. if the first item in pipeline stage is a $match or another required first stage operator. it will be placed before all other modifiers | AggregationPagingQuery | true | [] |
147
+ | removeProtected | boolean | **EXPERIMENTAL** - auto remove protected fields (those with `select: false` in schema) from aggregation results. Use with caution and test thoroughly in your environment | AggregationPagingQuery | | false |
148
+
149
+ ## Utilities
150
+
151
+ All utilities can be imported directly from the main package or from the `/utils` subpath:
152
+
153
+ ```typescript
154
+ // Direct import
155
+ import { buildPopulate, parseSortString, getPropertyFromDotNotation } from '@r5v/mongoose-paginate'
156
+
157
+ // Subpath import (all utilities)
158
+ import * as utils from '@r5v/mongoose-paginate/utils'
159
+ ```
160
+
161
+ ### Populate Utilities
162
+
163
+ | Name | Signature | Description |
164
+ |:-----|:----------|:------------|
165
+ | `buildPopulate` | `(pathString: string) => PopulateItem[]` | Creates a Mongoose populate object from dot notation string. Supports deep population with field selection using bracket notation: `"author[name].books[title],publisher[name]"` |
166
+
167
+ ```typescript
168
+ import { buildPopulate } from '@r5v/mongoose-paginate'
169
+
170
+ const populate = buildPopulate('author[name,email].books[title],publisher')
171
+ // Result: [
172
+ // { path: 'author', select: 'name email', populate: [{ path: 'books', select: 'title' }] },
173
+ // { path: 'publisher' }
174
+ // ]
175
+ ```
176
+
177
+ ### Sort Utilities
178
+
179
+ | Name | Signature | Description |
180
+ |:-----|:----------|:------------|
181
+ | `parseSortString` | `(sortString: string) => [string, SortOrder][]` | Parses a sort string into Mongoose sort array format. Example: `"name -createdAt"` → `[["name", 1], ["createdAt", -1]]` |
182
+ | `parseAggregateSortString` | `(sortString: string) => {[key: string]: SortOrder}` | Parses a sort string into aggregation pipeline sort object. Example: `"name -createdAt"` → `{ name: 1, createdAt: -1 }` |
183
+
184
+ ```typescript
185
+ import { parseSortString, parseAggregateSortString } from '@r5v/mongoose-paginate'
186
+
187
+ const sortArray = parseSortString('name 1, createdAt -1')
188
+ // Result: [["name", 1], ["createdAt", -1]]
189
+
190
+ const sortObj = parseAggregateSortString('name 1, createdAt -1')
191
+ // Result: { name: 1, createdAt: -1 }
192
+ ```
193
+
194
+ ### Dot Notation Utilities
195
+
196
+ | Name | Signature | Description |
197
+ |:-----|:----------|:------------|
198
+ | `getPropertyFromDotNotation` | `(obj: any, path: string) => any` | Gets a nested property value using dot notation path |
199
+ | `dotNotationToObject` | `(dotString: string, value?: unknown) => object` | Converts a dot notation string to a nested object |
200
+ | `createObjectFromDotNotation` | `(dotNotationMap: {[key: string]: any}) => object` | Creates a nested object from multiple dot notation key-value pairs |
201
+ | `setPropertyFromDotNotation` | `(obj: Record<string, unknown>, path: string, value: unknown) => object` | Sets a nested property value (mutates original object) |
202
+ | `setPropertiesFromDotNotation` | `(obj: Record<string, unknown>, dotNotationMap: Record<string, unknown>) => object` | Sets multiple nested properties (mutates original object) |
203
+ | `setPropertyFromDotNotationImmutable` | `(obj: Record<string, unknown>, path: string, value: unknown) => object` | Sets a nested property value (returns new object) |
204
+ | `setPropertiesFromDotNotationImmutable` | `(obj: Record<string, unknown>, dotNotationMap: Record<string, unknown>) => object` | Sets multiple nested properties (returns new object) |
205
+
206
+ ```typescript
207
+ import {
208
+ getPropertyFromDotNotation,
209
+ dotNotationToObject,
210
+ setPropertyFromDotNotation
211
+ } from '@r5v/mongoose-paginate'
212
+
213
+ // Get nested value
214
+ const user = { profile: { name: 'John', address: { city: 'NYC' } } }
215
+ getPropertyFromDotNotation(user, 'profile.address.city') // 'NYC'
216
+
217
+ // Create nested object from dot notation
218
+ dotNotationToObject('user.profile.name', 'John')
219
+ // Result: { user: { profile: { name: 'John' } } }
220
+
221
+ // Set nested property
222
+ const obj = { user: { name: 'John' } }
223
+ setPropertyFromDotNotation(obj, 'user.email', 'john@example.com')
224
+ // Result: { user: { name: 'John', email: 'john@example.com' } }
225
+ ```
226
+
227
+ ### Validation Utilities
228
+
229
+ | Name | Signature | Description |
230
+ |:-----|:----------|:------------|
231
+ | `isJsonString` | `(str: string) => boolean` | Checks if a string is valid JSON |
232
+ | `isValidDateString` | `(value: string) => boolean` | Checks if a string is a valid ISO 8601 date format |
233
+
234
+ ```typescript
235
+ import { isJsonString, isValidDateString } from '@r5v/mongoose-paginate'
236
+
237
+ isJsonString('{"name": "John"}') // true
238
+ isJsonString('invalid') // false
239
+
240
+ isValidDateString('2024-01-15') // true
241
+ isValidDateString('2024-01-15T10:30:00.000Z') // true
242
+ isValidDateString('invalid-date') // false
243
+ ```
244
+
245
+ ### Schema Traversal Utilities
246
+
247
+ | Name | Signature | Description |
248
+ |:-----|:----------|:------------|
249
+ | `buildFullPath` | `(parentPath: string, childPath: string) => string` | Builds a dot-notation path from parent and child segments |
250
+ | `traverseSchemaObject` | `(obj: any, callback: (obj, path) => void, currentPath?: string) => void` | Recursively traverses a Mongoose schema object, calling callback for each node |
251
+
252
+ ```typescript
253
+ import { buildFullPath, traverseSchemaObject } from '@r5v/mongoose-paginate'
254
+
255
+ // Build dot-notation paths
256
+ buildFullPath('user', 'profile') // 'user.profile'
257
+ buildFullPath('', 'name') // 'name'
258
+ buildFullPath('parent', '') // 'parent'
259
+
260
+ // Traverse schema objects
261
+ traverseSchemaObject(schemaType, (obj, currentPath) => {
262
+ if (obj.options?.ref) {
263
+ console.log(`Found ref at ${currentPath}: ${obj.options.ref}`)
264
+ }
265
+ })
266
+ ```
267
+
268
+ ## Types
269
+
270
+ All TypeScript types are exported and can be imported:
271
+
272
+ ```typescript
273
+ import type {
274
+ PagingQueryOptions,
275
+ AggregateQueryOptions,
276
+ QueryParameters,
277
+ PagingQueryParsedRequestParams,
278
+ AggregateQueryParsedRequestParams
279
+ } from '@r5v/mongoose-paginate'
280
+
281
+ // Or from the types subpath
282
+ import type * from '@r5v/mongoose-paginate/types'
283
+ ```
284
+
285
+ ## Build
286
+
287
+ ```text
288
+ ### build and run test server
289
+
290
+ $ yarn
291
+ $ yarn run build
292
+ $ cd test_server
293
+ $ yarn
294
+ $ yarn add ../ #adds the package to the local server
295
+ $ echo MONGODB_URI=http://localhost:27017/bookstore >> .env
296
+ $ yarn run seed
297
+ ### load seed data into bookstore database
298
+ $ yarn run start
299
+ ```
300
+
301
+
302
+ #### Aggregations Order of operations
303
+
304
+ 1. First pipeline stage (if `$search`, `$searchMeta`, or `$geoNear`)
305
+ 2. `$match` combining: `staticFilter` + `$filter` (if `enableFilter`) + first pipeline `$match` stage
306
+ 3. `$preSort` (if `enablePreSort` is true)
307
+ 4. Remaining pipeline stages
308
+ 5. `$select` / `$project`
309
+ 6. `$count` (adds `_count` fields for array sizes)
310
+ 7. `$postFilter` combining: `staticPostFilter` + `$postFilter` (if `enablePostFilter`)
311
+ 8. `$sort` (final sorting, can sort on computed fields)
312
+ 9. Apply pagination (`$skip`, `$limit`) and options
313
+
314
+
315
+ ### 1.0.17
316
+ - **Moved mongoose to peerDependencies** - Reduces bundle size for consumers who already have mongoose installed
317
+ - Supports mongoose >= 8.0.0 (tested with 8.16.0 and 9.1.4)
318
+
319
+ ### 1.0.15
320
+ - **Re-enabled `removeProtected` option** for `AggregationPagingQuery` (EXPERIMENTAL) - Automatically excludes fields marked with `select: false` in your schema (e.g., passwords, secret keys) from aggregation results. Use with caution and test thoroughly in your environment.
321
+ - Uses refactored `findProtectedPaths` utility which safely traverses schemas without JSON serialization
322
+
323
+ ### 1.0.14
324
+ - Added proper TypeScript package exports with subpaths (`/utils`, `/types`)
325
+ - Exported all utility functions (dot notation, sort parsing, validation)
326
+ - Exported all TypeScript types
327
+ - **Fixed Express Request type compatibility** - Added `RequestLike` interface to allow custom request types without index signature issues
328
+ - Fixed JSON.parse crash on malformed `$filter`/`$postFilter` parameters
329
+ - Fixed regex global flag bug in populate parsing
330
+ - Added input validation to constructors
331
+ - Improved type safety (reduced `any` usage)
332
+ - Removed deprecated `$includes` parameter
333
+ - Replaced `JSON.parse(JSON.stringify())` with `structuredClone()`
334
+ - Fixed inconsistent equality operator (`==` to `===`)
335
+ - **Fixed empty pipeline crash** - `AggregationPagingQuery.initQuery` no longer crashes when pipeline is empty
336
+ - **Refactored `buildPopulate`** - Extracted inner functions to module level for better testability
337
+ - **Refactored `findProtectedPaths`** - Removed JSON.stringify that could fail on circular references
338
+ - **Refactored `getPathsWithRef`** - Simplified input handling, removed brittle string parsing
339
+ - **Added `schemaTraversal` utility** - Shared `buildFullPath` and `traverseSchemaObject` functions for schema traversal
340
+
341
+ ### 1.0.13
342
+ - Fix issue where disablePaging was not working on aggregation query
343
+
344
+ ### 1.0.12
345
+ - Fix issue with AggregationPagingQuery where static post filter would not be applied if $postFilter param was not supplied
346
+ - updated typings on AggregationPagingQuery to include enablePostFilter, enableFilter, and enablePreSort
347
+ - flipped PagingQuery back to `disableFilter` instead of `enableFilter` option \# this was set incorrectly in 1.0.11 but still defaults to false
348
+
349
+ ### 1.0.11
350
+ Fix Issue with Typescript build
351
+
352
+ ### 1.0.9
353
+ Fix Issue with Typescript add buildPopulate Export
354
+
355
+ ### 1.0.8
356
+ Adds Deep Populate and Select Notation
357
+
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "@r5v/mongoose-paginate",
3
+ "version": "1.0.17",
4
+ "main": "./dist/index.js",
5
+ "module": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./utils": {
15
+ "types": "./dist/utils/index.d.ts",
16
+ "import": "./dist/utils/index.js",
17
+ "require": "./dist/utils/index.js",
18
+ "default": "./dist/utils/index.js"
19
+ },
20
+ "./types": {
21
+ "types": "./dist/types/index.d.ts",
22
+ "import": "./dist/types/index.js",
23
+ "require": "./dist/types/index.js",
24
+ "default": "./dist/types/index.js"
25
+ }
26
+ },
27
+ "scripts": {
28
+ "prebuild": "rimraf dist/",
29
+ "build": "tsc",
30
+ "postbuild": "copyfiles --error package.json README.md dist/",
31
+ "test": "concurrently --kill-others-on-fail --prefix none npm:test:*",
32
+ "test:unit": "jest"
33
+ },
34
+ "keywords": [
35
+ "mongoose",
36
+ "paging",
37
+ "mongodb"
38
+ ],
39
+ "license": "ISC",
40
+ "homepage": "https://github.com/RedFiveVentures/mongoose-paginate",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/RedFiveVentures/mongoose-paginate"
44
+ },
45
+ "bugs": {
46
+ "url": "https://github.com/RedFiveVentures/mongoose-paginate/issues"
47
+ },
48
+ "author": {
49
+ "name": "Noah Wallace",
50
+ "email": "noah@redfiveventures.com",
51
+ "url": "https://www.npmjs.com/~nwrfv"
52
+ },
53
+ "files": [
54
+ "package.json",
55
+ "./dist",
56
+ "README.md"
57
+ ],
58
+ "engines": {
59
+ "node": ">=20"
60
+ },
61
+ "peerDependencies": {
62
+ "mongoose": ">=8.0.0"
63
+ },
64
+ "dependencies": {
65
+ "qs": "^6.14.0"
66
+ },
67
+ "description": "A lightweight Node.js package that seamlessly bridges RESTful API query parameters to Mongoose operations. Automatically parses and transforms URL query strings into valid Mongoose queries, supporting filtering, sorting, pagination, field selection, and population. Simply pass your Express req.query object and get back a fully configured Mongoose query ready for execution. Perfect for rapidly building consistent, feature-rich APIs without repetitive query parsing logic",
68
+ "devDependencies": {
69
+ "@types/express": "^5.0.3",
70
+ "mongoose": "^9.1.4",
71
+ "@types/jest": "^30.0.0",
72
+ "@types/node": "^24.0.10",
73
+ "concurrently": "^9.2.0",
74
+ "copyfiles": "^2.4.1",
75
+ "jest": "^30.0.4",
76
+ "mockingoose": "^2.16.2",
77
+ "node-mocks-http": "^1.17.2",
78
+ "rimraf": "^6.0.1",
79
+ "ts-jest": "^29.4.0",
80
+ "ts-node-dev": "^2.0.0",
81
+ "tsx": "^4.20.3",
82
+ "typescript": "^5.8.3"
83
+ }
84
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@r5v/mongoose-paginate",
3
- "version": "1.0.15",
3
+ "version": "1.0.17",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -27,7 +27,7 @@
27
27
  "scripts": {
28
28
  "prebuild": "rimraf dist/",
29
29
  "build": "tsc",
30
- "copy-files": "copyfiles --error package.json dist/",
30
+ "postbuild": "copyfiles --error package.json README.md dist/",
31
31
  "test": "concurrently --kill-others-on-fail --prefix none npm:test:*",
32
32
  "test:unit": "jest"
33
33
  },
@@ -58,13 +58,16 @@
58
58
  "engines": {
59
59
  "node": ">=20"
60
60
  },
61
+ "peerDependencies": {
62
+ "mongoose": ">=8.0.0"
63
+ },
61
64
  "dependencies": {
62
- "mongoose": "^8.16.1",
63
65
  "qs": "^6.14.0"
64
66
  },
65
67
  "description": "A lightweight Node.js package that seamlessly bridges RESTful API query parameters to Mongoose operations. Automatically parses and transforms URL query strings into valid Mongoose queries, supporting filtering, sorting, pagination, field selection, and population. Simply pass your Express req.query object and get back a fully configured Mongoose query ready for execution. Perfect for rapidly building consistent, feature-rich APIs without repetitive query parsing logic",
66
68
  "devDependencies": {
67
69
  "@types/express": "^5.0.3",
70
+ "mongoose": "^9.1.4",
68
71
  "@types/jest": "^30.0.0",
69
72
  "@types/node": "^24.0.10",
70
73
  "concurrently": "^9.2.0",