@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.
- package/eslint.config.mjs +203 -0
- package/lib/query-parser.d.ts +1 -1
- package/lib/query-parser.js +8 -4
- package/lib/test.spec.d.ts +16 -1
- package/lib/test.spec.js +67 -65
- package/package.json +16 -12
- package/tslint.json +0 -62
|
@@ -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
|
+
}];
|
package/lib/query-parser.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export declare class MongooseQueryParser {
|
|
|
12
12
|
* @param {Object} [context]
|
|
13
13
|
* @return {QueryOptions}
|
|
14
14
|
*/
|
|
15
|
-
parse(query: string |
|
|
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
|
package/lib/query-parser.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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
|
|
344
|
+
let val;
|
|
345
|
+
let match;
|
|
342
346
|
if ((0, lodash_1.isString)(key)) {
|
|
343
347
|
({ match, val } = _match(key));
|
|
344
348
|
if (match) {
|
package/lib/test.spec.d.ts
CHANGED
|
@@ -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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
const parser = new _1.MongooseQueryParser();
|
|
21
|
+
const qry = 'date=2016-01-01&boolean=true&integer=10®exp=/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
|
|
24
|
-
chai_1.assert.isOk(parsed.filter
|
|
25
|
-
chai_1.assert.isOk(parsed.filter
|
|
26
|
-
chai_1.assert.isOk(parsed.filter
|
|
27
|
-
chai_1.assert.isOk(parsed.filter
|
|
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}×tamp>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
|
|
37
|
-
chai_1.assert.isOk(parsed.filter
|
|
38
|
-
chai_1.assert.isOk(parsed.filter
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
chai_1.assert.isOk(typeof parsed.filter
|
|
57
|
-
chai_1.assert.isOk(parsed.filter
|
|
58
|
-
chai_1.assert.isOk(typeof parsed.filter
|
|
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
|
-
|
|
62
|
+
const parser = new _1.MongooseQueryParser({
|
|
62
63
|
casters: { $: val => '$' + val },
|
|
63
64
|
});
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
chai_1.assert.equal('$1', parsed.filter
|
|
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
|
-
|
|
70
|
-
|
|
70
|
+
const parser = new _1.MongooseQueryParser();
|
|
71
|
+
const obj = {
|
|
71
72
|
$or: [{ key1: 'value1' }, { key2: 'value2' }],
|
|
72
73
|
};
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
chai_1.assert.isArray(parsed.filter
|
|
76
|
-
chai_1.assert.isOk(parsed.filter
|
|
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
|
-
|
|
80
|
-
|
|
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
|
|
90
|
+
chai_1.assert.isNotNull(parsed.filter.status);
|
|
90
91
|
chai_1.assert.isOk(!parsed.filter['${isActive}']);
|
|
91
|
-
chai_1.assert.isOk(parsed.filter
|
|
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
|
|
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
|
|
100
|
+
chai_1.assert.isNotNull(parsed.filter.$and[0].status);
|
|
100
101
|
}
|
|
101
102
|
parseLean() {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
153
|
-
chai_1.assert.isOk((0, mongoose_1.isObjectIdOrHexString)(parsed.filter
|
|
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
|
|
156
|
+
chai_1.assert.isObject(parsed.filter.dailyRate);
|
|
156
157
|
}
|
|
157
158
|
transformFilter() {
|
|
158
|
-
|
|
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
|
-
|
|
173
|
-
chai_1.assert.isOk((0, mongoose_1.isObjectIdOrHexString)(parsed.filter
|
|
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
|
|
176
|
-
chai_1.assert.isObject(parsed.filter
|
|
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
|
|
180
|
+
chai_1.assert.isOk((0, mongoose_1.isObjectIdOrHexString)(transformedFilter.filter._org2.$in[0]));
|
|
180
181
|
}
|
|
181
182
|
transformFilterNull() {
|
|
182
|
-
|
|
183
|
+
const parser = new _1.MongooseQueryParser();
|
|
183
184
|
const filter = {
|
|
184
185
|
dailyRate: { $eq: null },
|
|
185
186
|
};
|
|
186
|
-
|
|
187
|
+
const parsed = parser.parse({ filter });
|
|
187
188
|
chai_1.assert.isObject(parsed.filter);
|
|
188
189
|
}
|
|
189
190
|
transformFilter2() {
|
|
190
|
-
|
|
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
|
-
|
|
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
|
|
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",
|
|
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.
|
|
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": "
|
|
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": "^
|
|
36
|
-
"@types/lodash": "^4.17.
|
|
37
|
-
"@types/mocha": "^10.0.
|
|
38
|
-
"@types/node": "^22.
|
|
39
|
-
"@types/qs": "^6.9.
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
}
|