@geekbears/gb-mongoose-query-parser 1.3.20 → 1.3.22

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.
@@ -0,0 +1,203 @@
1
+ import typescriptEslint from "@typescript-eslint/eslint-plugin";
2
+ import globals from "globals";
3
+ import tsParser from "@typescript-eslint/parser";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import js from "@eslint/js";
7
+ import { FlatCompat } from "@eslint/eslintrc";
8
+
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = path.dirname(__filename);
11
+ const compat = new FlatCompat({
12
+ baseDirectory: __dirname,
13
+ recommendedConfig: js.configs.recommended,
14
+ allConfig: js.configs.all
15
+ });
16
+
17
+ export default [...compat.extends(
18
+ "plugin:@typescript-eslint/recommended",
19
+ "plugin:@typescript-eslint/recommended-requiring-type-checking",
20
+ "prettier",
21
+ ), {
22
+ plugins: {
23
+
24
+
25
+ "@typescript-eslint": typescriptEslint,
26
+ },
27
+
28
+ languageOptions: {
29
+ globals: {
30
+ ...globals.node,
31
+ },
32
+
33
+ parser: tsParser,
34
+ ecmaVersion: 5,
35
+ sourceType: "module",
36
+
37
+ parserOptions: {
38
+ project: "tsconfig.json",
39
+ },
40
+ },
41
+
42
+ rules: {
43
+ "@typescript-eslint/adjacent-overload-signatures": "error",
44
+
45
+ "@typescript-eslint/array-type": ["error", {
46
+ default: "array",
47
+ }],
48
+
49
+
50
+
51
+ "@typescript-eslint/consistent-type-assertions": "error",
52
+ "@typescript-eslint/dot-notation": "error",
53
+ "@typescript-eslint/explicit-function-return-type": "off",
54
+ "@typescript-eslint/explicit-module-boundary-types": "off",
55
+ "@typescript-eslint/indent": "off",
56
+
57
+ "@typescript-eslint/member-delimiter-style": ["off", {
58
+ multiline: {
59
+ delimiter: "none",
60
+ requireLast: true,
61
+ },
62
+
63
+ singleline: {
64
+ delimiter: "semi",
65
+ requireLast: false,
66
+ },
67
+ }],
68
+
69
+ "@typescript-eslint/naming-convention": ["error", {
70
+ selector: "variable",
71
+ format: ["camelCase", "UPPER_CASE", "PascalCase"],
72
+ leadingUnderscore: "allow",
73
+ trailingUnderscore: "forbid",
74
+ }],
75
+
76
+ "@typescript-eslint/no-empty-function": "error",
77
+ "@typescript-eslint/no-empty-interface": "error",
78
+ "@typescript-eslint/no-explicit-any": "off",
79
+ "@typescript-eslint/no-misused-new": "error",
80
+ "@typescript-eslint/no-namespace": "error",
81
+ "@typescript-eslint/no-parameter-properties": "off",
82
+ "@typescript-eslint/no-unsafe-assignment": "warn",
83
+ "@typescript-eslint/no-unsafe-argument": "warn",
84
+ "@typescript-eslint/no-unsafe-call": "warn",
85
+ "@typescript-eslint/no-floating-promises": "warn",
86
+ "@typescript-eslint/no-unsafe-member-access": "warn",
87
+ "@typescript-eslint/no-unsafe-return": "warn",
88
+ "@typescript-eslint/no-misused-promises": "warn",
89
+ "@typescript-eslint/no-unused-expressions": "off",
90
+ "@typescript-eslint/no-unsafe-argument": "warn",
91
+ "@typescript-eslint/no-unused-vars": "warn",
92
+ "@typescript-eslint/unbound-method": "warn",
93
+ "@typescript-eslint/no-base-to-string": "warn",
94
+ "id-denylist": "off",
95
+ "@typescript-eslint/no-this-alias": [
96
+ "error",
97
+ {
98
+ "allowDestructuring": true, // Allow `const { props, state } = this`; false by default
99
+ "allowedNames": ["me"] // Allow `const vm= this`; `[]` by default
100
+ }
101
+ ],
102
+
103
+ "@typescript-eslint/no-shadow": ["error", {
104
+ hoist: "all",
105
+ }],
106
+
107
+ "@typescript-eslint/no-unused-expressions": "error",
108
+ "@typescript-eslint/no-use-before-define": "off",
109
+ "@typescript-eslint/no-var-requires": "error",
110
+ "@typescript-eslint/prefer-for-of": "error",
111
+ "@typescript-eslint/prefer-function-type": "error",
112
+ "@typescript-eslint/prefer-namespace-keyword": "error",
113
+ "@typescript-eslint/quotes": "off",
114
+ "@typescript-eslint/semi": ["off", null],
115
+
116
+ "@typescript-eslint/triple-slash-reference": ["error", {
117
+ path: "always",
118
+ types: "prefer-import",
119
+ lib: "always",
120
+ }],
121
+
122
+ "@typescript-eslint/type-annotation-spacing": "off",
123
+ "@typescript-eslint/typedef": "off",
124
+ "@typescript-eslint/unified-signatures": "error",
125
+ "arrow-parens": ["off", "always"],
126
+ "brace-style": ["off", "off"],
127
+ "comma-dangle": "off",
128
+ complexity: "off",
129
+ "constructor-super": "error",
130
+ "dot-notation": "off",
131
+ "eol-last": "off",
132
+ eqeqeq: ["error", "smart"],
133
+ "guard-for-in": "error",
134
+
135
+ "id-denylist": [
136
+ "error",
137
+ "any",
138
+ "Number",
139
+ "number",
140
+ "String",
141
+ "string",
142
+ "Boolean",
143
+ "boolean",
144
+ "Undefined",
145
+ "undefined",
146
+ ],
147
+
148
+ "id-match": "error",
149
+ indent: "off",
150
+ "linebreak-style": "off",
151
+ "max-classes-per-file": ["error", 1],
152
+ "max-len": "off",
153
+ "new-parens": "off",
154
+ "newline-per-chained-call": "off",
155
+ "no-bitwise": "error",
156
+ "no-caller": "error",
157
+ "no-cond-assign": "error",
158
+
159
+ "no-debugger": "error",
160
+ "no-empty": "error",
161
+ "no-empty-function": "off",
162
+ "no-eval": "error",
163
+ "no-extra-semi": "off",
164
+ "no-fallthrough": "off",
165
+ "no-invalid-this": "off",
166
+ "no-irregular-whitespace": "off",
167
+ "no-multiple-empty-lines": "off",
168
+ "no-new-wrappers": "error",
169
+ "no-shadow": "off",
170
+ "no-throw-literal": "error",
171
+ "no-trailing-spaces": "off",
172
+ "no-undef-init": "error",
173
+ "no-underscore-dangle": "off",
174
+ "no-unsafe-finally": "error",
175
+ "no-unused-expressions": "off",
176
+ "no-unused-labels": "error",
177
+ "no-use-before-define": "off",
178
+ "no-var": "error",
179
+ "object-shorthand": "error",
180
+ "one-var": ["error", "never"],
181
+
182
+ "padded-blocks": ["off", {
183
+ blocks: "never",
184
+ }, {
185
+ allowSingleLineBlocks: true,
186
+ }],
187
+ "prefer-const": "error",
188
+ "quote-props": "off",
189
+ quotes: "off",
190
+ radix: "error",
191
+
192
+ semi: "off",
193
+ "space-before-function-paren": "off",
194
+ "space-in-parens": ["off", "never"],
195
+
196
+ "spaced-comment": ["error", "always", {
197
+ markers: ["/"],
198
+ }],
199
+
200
+ "use-isnan": "error",
201
+ "valid-typeof": "off",
202
+ },
203
+ }];
@@ -12,7 +12,7 @@ export declare class MongooseQueryParser {
12
12
  * @param {Object} [context]
13
13
  * @return {QueryOptions}
14
14
  */
15
- parse(query: string | Object, context?: Object): QueryOptions;
15
+ parse(query: string | object, context?: object): QueryOptions;
16
16
  /**
17
17
  * parses string to typed values
18
18
  * This methods will apply auto type casting on Number, RegExp, Date, Boolean and null
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MongooseQueryParser = void 0;
4
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
5
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
4
6
  const Moment = require("moment");
5
7
  const qs_1 = require("qs");
6
8
  const lodash_1 = require("lodash");
@@ -9,6 +11,7 @@ class MongooseQueryParser {
9
11
  this.options = options;
10
12
  this.defaultDateFormat = [Moment.ISO_8601];
11
13
  this.builtInCaster = {
14
+ // eslint-disable-next-line id-denylist
12
15
  string: val => String(val),
13
16
  date: val => {
14
17
  const m = Moment(val, this.options.dateFormat);
@@ -108,7 +111,7 @@ class MongooseQueryParser {
108
111
  return Number(value);
109
112
  }
110
113
  // Match dates
111
- let m = Moment(value, options.dateFormat);
114
+ const m = Moment(value, options.dateFormat);
112
115
  if (m.isValid()) {
113
116
  return m.toDate();
114
117
  }
@@ -327,18 +330,19 @@ class MongooseQueryParser {
327
330
  const _match = str => {
328
331
  const reg = /^\$\{([a-zA-Z_$][0-9a-zA-Z_$]*)\}$/;
329
332
  const match = str.match(reg);
330
- let val = undefined;
333
+ let val;
331
334
  if (match) {
332
335
  val = (0, lodash_1.property)(match[1])(context);
333
336
  if (val === undefined) {
334
337
  throw new Error(`No predefined query found for the provided reference [${match[1]}]`);
335
338
  }
336
339
  }
337
- return { match: !!match, val: val };
340
+ return { match: !!match, val };
338
341
  };
339
342
  const _transform = obj => {
340
343
  return (0, lodash_1.reduce)(obj, (prev, curr, key) => {
341
- let val = undefined, match = undefined;
344
+ let val;
345
+ let match;
342
346
  if ((0, lodash_1.isString)(key)) {
343
347
  ({ match, val } = _match(key));
344
348
  if (match) {
@@ -1 +1,16 @@
1
- export {};
1
+ export declare class Tester {
2
+ generalParse(): void;
3
+ generalParse2(): void;
4
+ populateParse(): void;
5
+ builtInCastersTest(): void;
6
+ parseCaster(): void;
7
+ parseJsonFilter(): void;
8
+ parsePredefined(): void;
9
+ parseLean(): void;
10
+ parseComplex(): void;
11
+ parseId(): void;
12
+ transformFilter(): void;
13
+ transformFilterNull(): void;
14
+ transformFilter2(): void;
15
+ transformFilterAggregate(): void;
16
+ }
package/lib/test.spec.js CHANGED
@@ -9,6 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.Tester = void 0;
12
13
  const mocha_1 = require("@testdeck/mocha");
13
14
  const chai_1 = require("chai");
14
15
  const _1 = require("./");
@@ -16,15 +17,15 @@ const mongoose_1 = require("mongoose");
16
17
  const lodash_1 = require("lodash");
17
18
  let Tester = class Tester {
18
19
  generalParse() {
19
- let parser = new _1.MongooseQueryParser();
20
- let qry = 'date=2016-01-01&boolean=true&integer=10&regexp=/foobar/i&null=null';
21
- let parsed = parser.parse(qry);
20
+ const parser = new _1.MongooseQueryParser();
21
+ const qry = 'date=2016-01-01&boolean=true&integer=10&regexp=/foobar/i&null=null';
22
+ const parsed = parser.parse(qry);
22
23
  chai_1.assert.isNotNull(parsed.filter);
23
- chai_1.assert.isOk(parsed.filter['date'] instanceof Date);
24
- chai_1.assert.isOk(parsed.filter['boolean'] === true);
25
- chai_1.assert.isOk(parsed.filter['integer'] === 10);
26
- chai_1.assert.isOk(parsed.filter['regexp'] instanceof RegExp);
27
- chai_1.assert.isOk(parsed.filter['null'] === null);
24
+ chai_1.assert.isOk(parsed.filter.date instanceof Date);
25
+ chai_1.assert.isOk(parsed.filter.boolean === true);
26
+ chai_1.assert.isOk(parsed.filter.integer === 10);
27
+ chai_1.assert.isOk(parsed.filter.regexp instanceof RegExp);
28
+ chai_1.assert.isOk(parsed.filter.null === null);
28
29
  }
29
30
  generalParse2() {
30
31
  const parser = new _1.MongooseQueryParser();
@@ -33,9 +34,9 @@ let Tester = class Tester {
33
34
  sentStatus: 'sent',
34
35
  };
35
36
  const parsed = parser.parse('${vip}&status=${sentStatus}&timestamp>2017-10-01&author.firstName=/john/i&limit=100&skip=50&sort=-timestamp&select=name&populate=children', predefined);
36
- chai_1.assert.isOk(parsed.filter['status'] === predefined.sentStatus);
37
- chai_1.assert.isOk(parsed.filter['name'].$in.length === 3); // checking parsing of ${vip}
38
- chai_1.assert.isOk(parsed.filter['timestamp']['$gt'] instanceof Date);
37
+ chai_1.assert.isOk(parsed.filter.status === predefined.sentStatus);
38
+ chai_1.assert.isOk(parsed.filter.name.$in.length === 3); // checking parsing of ${vip}
39
+ chai_1.assert.isOk(parsed.filter.timestamp.$gt instanceof Date);
39
40
  chai_1.assert.isOk(parsed.filter['author.firstName'] instanceof RegExp);
40
41
  chai_1.assert.isOk(parsed.limit === 100);
41
42
  chai_1.assert.isOk(parsed.skip === 50);
@@ -43,41 +44,41 @@ let Tester = class Tester {
43
44
  chai_1.assert.isNotNull(parsed.select);
44
45
  chai_1.assert.isNotNull(parsed.populate);
45
46
  }
46
- async populateParse() {
47
- let parser = new _1.MongooseQueryParser();
48
- let qry = '_id=1&populate=serviceSalesOrders,customer.category,customer.name';
49
- let parsed = parser.parse(qry);
47
+ populateParse() {
48
+ const parser = new _1.MongooseQueryParser();
49
+ const qry = '_id=1&populate=serviceSalesOrders,customer.category,customer.name';
50
+ const parsed = parser.parse(qry);
50
51
  chai_1.assert.isOk(parsed.populate.length === 2);
51
52
  }
52
53
  builtInCastersTest() {
53
- let parser = new _1.MongooseQueryParser();
54
- let qry = 'key1=string(10)&key2=date(2017-10-01)&key3=string(null)';
55
- let parsed = parser.parse(qry);
56
- chai_1.assert.isOk(typeof parsed.filter['key1'] === 'string');
57
- chai_1.assert.isOk(parsed.filter['key2'] instanceof Date);
58
- chai_1.assert.isOk(typeof parsed.filter['key3'] === 'string');
54
+ const parser = new _1.MongooseQueryParser();
55
+ const qry = 'key1=string(10)&key2=date(2017-10-01)&key3=string(null)';
56
+ const parsed = parser.parse(qry);
57
+ chai_1.assert.isOk(typeof parsed.filter.key1 === 'string');
58
+ chai_1.assert.isOk(parsed.filter.key2 instanceof Date);
59
+ chai_1.assert.isOk(typeof parsed.filter.key3 === 'string');
59
60
  }
60
61
  parseCaster() {
61
- let parser = new _1.MongooseQueryParser({
62
+ const parser = new _1.MongooseQueryParser({
62
63
  casters: { $: val => '$' + val },
63
64
  });
64
- let qry = '_id=$(1)';
65
- let parsed = parser.parse(qry);
66
- chai_1.assert.equal('$1', parsed.filter['_id']);
65
+ const qry = '_id=$(1)';
66
+ const parsed = parser.parse(qry);
67
+ chai_1.assert.equal('$1', parsed.filter._id);
67
68
  }
68
69
  parseJsonFilter() {
69
- let parser = new _1.MongooseQueryParser();
70
- let obj = {
70
+ const parser = new _1.MongooseQueryParser();
71
+ const obj = {
71
72
  $or: [{ key1: 'value1' }, { key2: 'value2' }],
72
73
  };
73
- let qry = `filter=${JSON.stringify(obj)}&name=Google`;
74
- let parsed = parser.parse(qry);
75
- chai_1.assert.isArray(parsed.filter['$or']);
76
- chai_1.assert.isOk(parsed.filter['name'] === 'Google');
74
+ const qry = `filter=${JSON.stringify(obj)}&name=Google`;
75
+ const parsed = parser.parse(qry);
76
+ chai_1.assert.isArray(parsed.filter.$or);
77
+ chai_1.assert.isOk(parsed.filter.name === 'Google');
77
78
  }
78
79
  parsePredefined() {
79
- let parser = new _1.MongooseQueryParser();
80
- let preDefined = {
80
+ const parser = new _1.MongooseQueryParser();
81
+ const preDefined = {
81
82
  isActive: { status: { $in: ['In Progress', 'Pending'] } },
82
83
  vip: ['KFC', 'Google', 'MS'],
83
84
  secret: 'my_secret',
@@ -86,35 +87,35 @@ let Tester = class Tester {
86
87
  // test predefined query as key
87
88
  let qry = '${isActive}&name&${mykey}=1';
88
89
  let parsed = parser.parse(qry, preDefined);
89
- chai_1.assert.isNotNull(parsed.filter['status']);
90
+ chai_1.assert.isNotNull(parsed.filter.status);
90
91
  chai_1.assert.isOk(!parsed.filter['${isActive}']);
91
- chai_1.assert.isOk(parsed.filter['realkey'] === 1);
92
+ chai_1.assert.isOk(parsed.filter.realkey === 1);
92
93
  // test predefined query as value
93
94
  qry = 'secret=${secret}';
94
95
  parsed = parser.parse(qry, preDefined);
95
- chai_1.assert.isOk(parsed.filter['secret'] === preDefined.secret);
96
+ chai_1.assert.isOk(parsed.filter.secret === preDefined.secret);
96
97
  // test predefined query in json
97
98
  qry = 'filter={"$and": ["${isActive}", {"customer": "VDF"}]}';
98
99
  parsed = parser.parse(qry, preDefined);
99
- chai_1.assert.isNotNull(parsed.filter['$and'][0].status);
100
+ chai_1.assert.isNotNull(parsed.filter.$and[0].status);
100
101
  }
101
102
  parseLean() {
102
- let parser = new _1.MongooseQueryParser();
103
- let qryTrue = 'lean=true';
104
- let qryFalse = 'lean=false';
105
- let qryUndefined = 'lean=';
106
- let qryNotBoolean = 'lean=any';
107
- let parsedTrue = parser.parse(qryTrue);
108
- let parsedFalse = parser.parse(qryFalse);
109
- let parsedUndefined = parser.parse(qryUndefined);
110
- let parsedNotBoolean = parser.parse(qryNotBoolean);
103
+ const parser = new _1.MongooseQueryParser();
104
+ const qryTrue = 'lean=true';
105
+ const qryFalse = 'lean=false';
106
+ const qryUndefined = 'lean=';
107
+ const qryNotBoolean = 'lean=any';
108
+ const parsedTrue = parser.parse(qryTrue);
109
+ const parsedFalse = parser.parse(qryFalse);
110
+ const parsedUndefined = parser.parse(qryUndefined);
111
+ const parsedNotBoolean = parser.parse(qryNotBoolean);
111
112
  chai_1.assert.isTrue(parsedTrue.lean);
112
113
  chai_1.assert.isFalse(parsedFalse.lean);
113
114
  chai_1.assert.notNestedProperty(parsedUndefined, 'lean');
114
115
  chai_1.assert.isFalse(parsedNotBoolean.lean);
115
116
  }
116
117
  parseComplex() {
117
- let parser = new _1.MongooseQueryParser();
118
+ const parser = new _1.MongooseQueryParser();
118
119
  const preDefined = {
119
120
  $and: [
120
121
  { $or: [{ __keywords: { $elemMatch: { $regex: 'Stranger', $options: 'i' } } }] },
@@ -132,11 +133,11 @@ let Tester = class Tester {
132
133
  ],
133
134
  };
134
135
  const query = 'filter={"$and":[{"$or":[{"__keywords":{"$elemMatch":{"$regex":"Stranger","$options":"i"}}}]},{"dailyRate":{"$gte":0,"$lte":60}},{"geolocation":{"$near":{"$geometry":{"type":"Point","coordinates":[-122.16106,37.37646]},"$minDistance":0,"$maxDistance":10}}},{"unavailableDates":{"$nin":[]}}]}';
135
- let parsed = parser.parse(query);
136
+ const parsed = parser.parse(query);
136
137
  chai_1.assert.isOk((0, lodash_1.isEqual)(parsed.filter, preDefined));
137
138
  }
138
139
  parseId() {
139
- let parser = new _1.MongooseQueryParser();
140
+ const parser = new _1.MongooseQueryParser();
140
141
  const filter = {
141
142
  dailyRate: { $gte: 0, $lte: 60 },
142
143
  geolocation: {
@@ -149,13 +150,13 @@ let Tester = class Tester {
149
150
  unavailableDates: { $nin: [] },
150
151
  _org: new mongoose_1.Types.ObjectId(),
151
152
  };
152
- let parsed = parser.parse({ filter });
153
- chai_1.assert.isOk((0, mongoose_1.isObjectIdOrHexString)(parsed.filter['_org']));
153
+ const parsed = parser.parse({ filter });
154
+ chai_1.assert.isOk((0, mongoose_1.isObjectIdOrHexString)(parsed.filter._org));
154
155
  chai_1.assert.isObject(parsed.filter);
155
- chai_1.assert.isObject(parsed.filter['dailyRate']);
156
+ chai_1.assert.isObject(parsed.filter.dailyRate);
156
157
  }
157
158
  transformFilter() {
158
- let parser = new _1.MongooseQueryParser();
159
+ const parser = new _1.MongooseQueryParser();
159
160
  const filter = {
160
161
  dailyRate: { $gte: 0, $lte: 60 },
161
162
  geolocation: {
@@ -169,32 +170,32 @@ let Tester = class Tester {
169
170
  _org: new mongoose_1.Types.ObjectId().toString(),
170
171
  _org2: { $in: [new mongoose_1.Types.ObjectId().toString()] },
171
172
  };
172
- let parsed = parser.parse({ filter });
173
- chai_1.assert.isOk((0, mongoose_1.isObjectIdOrHexString)(parsed.filter['_org']));
173
+ const parsed = parser.parse({ filter });
174
+ chai_1.assert.isOk((0, mongoose_1.isObjectIdOrHexString)(parsed.filter._org));
174
175
  chai_1.assert.isObject(parsed.filter);
175
- chai_1.assert.isObject(parsed.filter['dailyRate']);
176
- chai_1.assert.isObject(parsed.filter['_org2']);
176
+ chai_1.assert.isObject(parsed.filter.dailyRate);
177
+ chai_1.assert.isObject(parsed.filter._org2);
177
178
  const transformedFilter = _1.QueryParser.transformFilter(parsed);
178
179
  chai_1.assert.isOk((0, mongoose_1.isObjectIdOrHexString)(transformedFilter.filter._org));
179
- chai_1.assert.isOk((0, mongoose_1.isObjectIdOrHexString)(transformedFilter.filter._org2['$in'][0]));
180
+ chai_1.assert.isOk((0, mongoose_1.isObjectIdOrHexString)(transformedFilter.filter._org2.$in[0]));
180
181
  }
181
182
  transformFilterNull() {
182
- let parser = new _1.MongooseQueryParser();
183
+ const parser = new _1.MongooseQueryParser();
183
184
  const filter = {
184
185
  dailyRate: { $eq: null },
185
186
  };
186
- let parsed = parser.parse({ filter });
187
+ const parsed = parser.parse({ filter });
187
188
  chai_1.assert.isObject(parsed.filter);
188
189
  }
189
190
  transformFilter2() {
190
- let parser = new _1.MongooseQueryParser();
191
+ const parser = new _1.MongooseQueryParser();
191
192
  const filter = {
192
193
  _tags: { $in: ['66885d0e304ef564c27f5315'] },
193
194
  };
194
195
  const query = { filter, populate: 'tags' };
195
- let parsed = parser.parse(query);
196
+ const parsed = parser.parse(query);
196
197
  const transformedFilter = _1.QueryParser.transformFilter(parsed);
197
- chai_1.assert.isOk((0, mongoose_1.isObjectIdOrHexString)(transformedFilter.filter._tags['$in'][0]));
198
+ chai_1.assert.isOk((0, mongoose_1.isObjectIdOrHexString)(transformedFilter.filter._tags.$in[0]));
198
199
  }
199
200
  transformFilterAggregate() {
200
201
  // let parser = new MongooseQueryParser();
@@ -247,6 +248,7 @@ let Tester = class Tester {
247
248
  chai_1.assert.isOk((0, mongoose_1.isObjectIdOrHexString)(transformComplexLookupFilter.$lookup.pipeline[0].$match.$expr.$eq[0]));
248
249
  }
249
250
  };
251
+ exports.Tester = Tester;
250
252
  __decorate([
251
253
  (0, mocha_1.test)('should parse general query'),
252
254
  __metadata("design:type", Function),
@@ -263,7 +265,7 @@ __decorate([
263
265
  (0, mocha_1.test)('should parse populate query'),
264
266
  __metadata("design:type", Function),
265
267
  __metadata("design:paramtypes", []),
266
- __metadata("design:returntype", Promise)
268
+ __metadata("design:returntype", void 0)
267
269
  ], Tester.prototype, "populateParse", null);
268
270
  __decorate([
269
271
  (0, mocha_1.test)('should parse built in casters'),
@@ -331,7 +333,7 @@ __decorate([
331
333
  __metadata("design:paramtypes", []),
332
334
  __metadata("design:returntype", void 0)
333
335
  ], Tester.prototype, "transformFilterAggregate", null);
334
- Tester = __decorate([
336
+ exports.Tester = Tester = __decorate([
335
337
  (0, mocha_1.suite)('Tester')
336
338
  ], Tester);
337
339
  //# sourceMappingURL=test.spec.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geekbears/gb-mongoose-query-parser",
3
- "version": "1.3.20",
3
+ "version": "1.3.22",
4
4
  "description": "Convert url query string to MongooseJs friendly query object including advanced filtering, sorting, population, deep population, string template, type casting and many more...",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.ts",
@@ -10,7 +10,7 @@
10
10
  "prepublishOnly": "npm run compile",
11
11
  "pretest": "npm run compile",
12
12
  "test": "mocha ./lib/**/*.spec.js",
13
- "lint": "tslint src/**/*.ts",
13
+ "lint": "eslint -c eslint.config.mjs src/*.ts --fix",
14
14
  "format": "prettier --write \"src/**/*.ts\""
15
15
  },
16
16
  "repository": {
@@ -32,26 +32,30 @@
32
32
  "homepage": "https://gitlab.com/geekbears/utilities/backend/gb-mongoose-query-parser#readme",
33
33
  "devDependencies": {
34
34
  "@testdeck/mocha": "^0.3.3",
35
- "@types/chai": "^4.3.17",
36
- "@types/lodash": "^4.17.7",
37
- "@types/mocha": "^10.0.7",
38
- "@types/node": "^22.4.0",
39
- "@types/qs": "^6.9.15",
35
+ "@types/chai": "^5.0.1",
36
+ "@types/lodash": "^4.17.13",
37
+ "@types/mocha": "^10.0.10",
38
+ "@types/node": "^22.9.3",
39
+ "@types/qs": "^6.9.17",
40
+ "@typescript-eslint/eslint-plugin": "^8.16.0",
41
+ "@typescript-eslint/parser": "^8.16.0",
40
42
  "chai": "^4.5.0",
41
- "mocha": "^10.7.3",
43
+ "eslint": "^9.15.0",
44
+ "eslint-config-prettier": "^9.1.0",
45
+ "eslint-plugin-prettier": "^5.2.1",
46
+ "mocha": "^10.8.2",
42
47
  "prettier": "^3.3.3",
43
48
  "rimraf": "^6.0.1",
44
49
  "ts-node": "^10.9.2",
45
- "tslint": "^6.1.3",
46
- "typescript": "^5.5.4"
50
+ "typescript": "^5.7.2"
47
51
  },
48
52
  "dependencies": {
49
53
  "lodash": "^4.17.21",
50
54
  "moment": "^2.30.1"
51
55
  },
52
56
  "peerDependencies": {
57
+ "class-validator": "0.10 - 0.15",
53
58
  "mongoose": "7 - 9",
54
- "qs": "^6.10.1",
55
- "class-validator": "0.10 - 0.15"
59
+ "qs": "^6.10.1"
56
60
  }
57
61
  }
package/tslint.json DELETED
@@ -1,62 +0,0 @@
1
- {
2
- "rules": {
3
- "no-inferrable-types": true,
4
- "class-name": true,
5
- "comment-format": [
6
- true,
7
- "check-space"
8
- ],
9
- "indent": [
10
- true,
11
- "spaces"
12
- ],
13
- "eofline": true,
14
- "no-duplicate-variable": true,
15
- "no-eval": true,
16
- "no-arg": true,
17
- "no-internal-module": true,
18
- "no-trailing-whitespace": true,
19
- "no-bitwise": true,
20
- "no-unused-expression": true,
21
- "no-var-keyword": true,
22
- "one-line": [
23
- true,
24
- "check-catch",
25
- "check-else",
26
- "check-open-brace",
27
- "check-whitespace"
28
- ],
29
- "quotemark": [
30
- true,
31
- "single",
32
- "avoid-escape"
33
- ],
34
- "semicolon": [true, "always"],
35
- "typedef-whitespace": [
36
- true,
37
- {
38
- "call-signature": "nospace",
39
- "index-signature": "nospace",
40
- "parameter": "nospace",
41
- "property-declaration": "nospace",
42
- "variable-declaration": "nospace"
43
- }
44
- ],
45
- "curly": true,
46
- "variable-name": [
47
- true,
48
- "ban-keywords",
49
- "check-format",
50
- "allow-leading-underscore",
51
- "allow-pascal-case"
52
- ],
53
- "whitespace": [
54
- true,
55
- "check-branch",
56
- "check-decl",
57
- "check-operator",
58
- "check-separator",
59
- "check-type"
60
- ]
61
- }
62
- }