filter-kit 2.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/README.md +294 -0
- package/dist/cjs/filters/buildDateFilter.d.ts +11 -0
- package/dist/cjs/filters/buildDateFilter.d.ts.map +1 -0
- package/dist/cjs/filters/buildDateFilter.js +39 -0
- package/dist/cjs/filters/buildDateFilter.js.map +1 -0
- package/dist/cjs/filters/buildDynamicFilters.d.ts +3 -0
- package/dist/cjs/filters/buildDynamicFilters.d.ts.map +1 -0
- package/dist/cjs/filters/buildDynamicFilters.js +110 -0
- package/dist/cjs/filters/buildDynamicFilters.js.map +1 -0
- package/dist/cjs/filters/buildPagination.d.ts +15 -0
- package/dist/cjs/filters/buildPagination.d.ts.map +1 -0
- package/dist/cjs/filters/buildPagination.js +30 -0
- package/dist/cjs/filters/buildPagination.js.map +1 -0
- package/dist/cjs/filters/buildPopulate.d.ts +3 -0
- package/dist/cjs/filters/buildPopulate.d.ts.map +1 -0
- package/dist/cjs/filters/buildPopulate.js +45 -0
- package/dist/cjs/filters/buildPopulate.js.map +1 -0
- package/dist/cjs/filters/buildSearch.d.ts +4 -0
- package/dist/cjs/filters/buildSearch.d.ts.map +1 -0
- package/dist/cjs/filters/buildSearch.js +57 -0
- package/dist/cjs/filters/buildSearch.js.map +1 -0
- package/dist/cjs/filters/buildSort.d.ts +2 -0
- package/dist/cjs/filters/buildSort.d.ts.map +1 -0
- package/dist/cjs/filters/buildSort.js +19 -0
- package/dist/cjs/filters/buildSort.js.map +1 -0
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +6 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/queryBuilder.d.ts +3 -0
- package/dist/cjs/queryBuilder.d.ts.map +1 -0
- package/dist/cjs/queryBuilder.js +75 -0
- package/dist/cjs/queryBuilder.js.map +1 -0
- package/dist/cjs/types.d.ts +48 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/filters/buildDateFilter.d.ts +11 -0
- package/dist/esm/filters/buildDateFilter.d.ts.map +1 -0
- package/dist/esm/filters/buildDateFilter.js +36 -0
- package/dist/esm/filters/buildDateFilter.js.map +1 -0
- package/dist/esm/filters/buildDynamicFilters.d.ts +3 -0
- package/dist/esm/filters/buildDynamicFilters.d.ts.map +1 -0
- package/dist/esm/filters/buildDynamicFilters.js +107 -0
- package/dist/esm/filters/buildDynamicFilters.js.map +1 -0
- package/dist/esm/filters/buildPagination.d.ts +15 -0
- package/dist/esm/filters/buildPagination.d.ts.map +1 -0
- package/dist/esm/filters/buildPagination.js +27 -0
- package/dist/esm/filters/buildPagination.js.map +1 -0
- package/dist/esm/filters/buildPopulate.d.ts +3 -0
- package/dist/esm/filters/buildPopulate.d.ts.map +1 -0
- package/dist/esm/filters/buildPopulate.js +42 -0
- package/dist/esm/filters/buildPopulate.js.map +1 -0
- package/dist/esm/filters/buildSearch.d.ts +4 -0
- package/dist/esm/filters/buildSearch.d.ts.map +1 -0
- package/dist/esm/filters/buildSearch.js +54 -0
- package/dist/esm/filters/buildSearch.js.map +1 -0
- package/dist/esm/filters/buildSort.d.ts +2 -0
- package/dist/esm/filters/buildSort.d.ts.map +1 -0
- package/dist/esm/filters/buildSort.js +16 -0
- package/dist/esm/filters/buildSort.js.map +1 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/queryBuilder.d.ts +3 -0
- package/dist/esm/queryBuilder.d.ts.map +1 -0
- package/dist/esm/queryBuilder.js +72 -0
- package/dist/esm/queryBuilder.js.map +1 -0
- package/dist/esm/types.d.ts +48 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildSearch.js","sourceRoot":"","sources":["../../../src/filters/buildSearch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildSort.d.ts","sourceRoot":"","sources":["../../../src/filters/buildSort.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,KAAK,GAAG,MAAM,GAC3B,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAgBxB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildSort = buildSort;
|
|
4
|
+
function buildSort(querySort, queryOrder, defaultSort, defaultOrder) {
|
|
5
|
+
var _a;
|
|
6
|
+
const sortFields = ((querySort && querySort.trim()) || defaultSort)
|
|
7
|
+
.split(',')
|
|
8
|
+
.map((s) => s.trim())
|
|
9
|
+
.filter((s) => s.length > 0);
|
|
10
|
+
const orderParts = (queryOrder !== null && queryOrder !== void 0 ? queryOrder : '').split(',').map((o) => o.trim());
|
|
11
|
+
const result = {};
|
|
12
|
+
for (let i = 0; i < sortFields.length; i++) {
|
|
13
|
+
const rawOrder = (_a = orderParts[i]) !== null && _a !== void 0 ? _a : '';
|
|
14
|
+
const dir = rawOrder === 'asc' || rawOrder === 'desc' ? rawOrder : i === 0 ? defaultOrder : 'asc';
|
|
15
|
+
result[sortFields[i]] = dir === 'asc' ? 1 : -1;
|
|
16
|
+
}
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=buildSort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildSort.js","sourceRoot":"","sources":["../../../src/filters/buildSort.ts"],"names":[],"mappings":";;AAAA,8BAqBC;AArBD,SAAgB,SAAS,CACvB,SAA6B,EAC7B,UAA8B,EAC9B,WAAmB,EACnB,YAA4B;;IAE5B,MAAM,UAAU,GAAG,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,WAAW,CAAC;SAChE,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEtE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAA,UAAU,CAAC,CAAC,CAAC,mCAAI,EAAE,CAAC;QACrC,MAAM,GAAG,GACP,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;QACxF,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.queryBuilder = void 0;
|
|
4
|
+
var queryBuilder_1 = require("./queryBuilder");
|
|
5
|
+
Object.defineProperty(exports, "queryBuilder", { enumerable: true, get: function () { return queryBuilder_1.queryBuilder; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,+CAA8C;AAArC,4GAAA,YAAY,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryBuilder.d.ts","sourceRoot":"","sources":["../../src/queryBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAkB,MAAM,SAAS,CAAC;AAQlF,wBAAsB,YAAY,CAAC,CAAC,GAAG,GAAG,EACxC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC9B,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAwHhC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.queryBuilder = queryBuilder;
|
|
4
|
+
const buildSearch_1 = require("./filters/buildSearch");
|
|
5
|
+
const buildPagination_1 = require("./filters/buildPagination");
|
|
6
|
+
const buildSort_1 = require("./filters/buildSort");
|
|
7
|
+
const buildDateFilter_1 = require("./filters/buildDateFilter");
|
|
8
|
+
const buildPopulate_1 = require("./filters/buildPopulate");
|
|
9
|
+
const buildDynamicFilters_1 = require("./filters/buildDynamicFilters");
|
|
10
|
+
async function queryBuilder(options) {
|
|
11
|
+
var _a, _b;
|
|
12
|
+
const { model, query, searchFields, searchMode = 'or', allowedFilters, defaultSort = 'createdAt', defaultOrder = 'desc', defaultLimit = 10, maxLimit = 100, populate: optionPopulate, select: optionSelect, dateField, dateFields, lean = false, customFilter, softDelete, withCount = true, } = options;
|
|
13
|
+
const filterParts = [];
|
|
14
|
+
const searchFilter = (0, buildSearch_1.buildSearch)(query['search'], searchFields, searchMode);
|
|
15
|
+
if (Object.keys(searchFilter).length > 0)
|
|
16
|
+
filterParts.push(searchFilter);
|
|
17
|
+
// Single dateField (backward compat)
|
|
18
|
+
if (dateField) {
|
|
19
|
+
const dateFilter = (0, buildDateFilter_1.buildDateFilter)(query['from'], query['to'], dateField);
|
|
20
|
+
if (Object.keys(dateFilter).length > 0)
|
|
21
|
+
filterParts.push(dateFilter);
|
|
22
|
+
}
|
|
23
|
+
// Multiple dateFields
|
|
24
|
+
for (const cfg of dateFields !== null && dateFields !== void 0 ? dateFields : []) {
|
|
25
|
+
const dateFilter = (0, buildDateFilter_1.buildDateFilter)(query[(_a = cfg.fromParam) !== null && _a !== void 0 ? _a : 'from'], query[(_b = cfg.toParam) !== null && _b !== void 0 ? _b : 'to'], cfg.field);
|
|
26
|
+
if (Object.keys(dateFilter).length > 0)
|
|
27
|
+
filterParts.push(dateFilter);
|
|
28
|
+
}
|
|
29
|
+
const dynamicFilter = (0, buildDynamicFilters_1.buildDynamicFilters)(query, allowedFilters, model);
|
|
30
|
+
if (Object.keys(dynamicFilter).length > 0)
|
|
31
|
+
filterParts.push(dynamicFilter);
|
|
32
|
+
if (customFilter && Object.keys(customFilter).length > 0) {
|
|
33
|
+
filterParts.push(customFilter);
|
|
34
|
+
}
|
|
35
|
+
if (softDelete) {
|
|
36
|
+
const excludeVal = softDelete.value !== undefined ? softDelete.value : true;
|
|
37
|
+
filterParts.push({ [softDelete.field]: { $ne: excludeVal } });
|
|
38
|
+
}
|
|
39
|
+
const filter = filterParts.length > 1
|
|
40
|
+
? { $and: filterParts }
|
|
41
|
+
: filterParts.length === 1
|
|
42
|
+
? filterParts[0]
|
|
43
|
+
: {};
|
|
44
|
+
const { page, limit, skip } = (0, buildPagination_1.buildPagination)(query['page'], query['limit'], defaultLimit, maxLimit);
|
|
45
|
+
const sort = (0, buildSort_1.buildSort)(query['sort'], query['order'], defaultSort, defaultOrder);
|
|
46
|
+
const populateFields = (0, buildPopulate_1.buildPopulate)(query['populate'], optionPopulate);
|
|
47
|
+
const selectParam = query['select'];
|
|
48
|
+
const selectValue = selectParam && selectParam.trim() !== ''
|
|
49
|
+
? selectParam.replace(/,/g, ' ')
|
|
50
|
+
: optionSelect;
|
|
51
|
+
let findQuery = model.find(filter).sort(sort).skip(skip).limit(limit);
|
|
52
|
+
for (const pop of populateFields) {
|
|
53
|
+
findQuery = findQuery.populate(pop);
|
|
54
|
+
}
|
|
55
|
+
if (selectValue !== undefined && selectValue !== null) {
|
|
56
|
+
findQuery = findQuery.select(selectValue);
|
|
57
|
+
}
|
|
58
|
+
if (lean) {
|
|
59
|
+
findQuery = findQuery.lean();
|
|
60
|
+
}
|
|
61
|
+
const [data, total] = withCount
|
|
62
|
+
? await Promise.all([findQuery.exec(), model.countDocuments(filter)])
|
|
63
|
+
: [await findQuery.exec(), 0];
|
|
64
|
+
const pages = withCount ? Math.ceil(total / limit) : 0;
|
|
65
|
+
const pagination = {
|
|
66
|
+
total,
|
|
67
|
+
page,
|
|
68
|
+
limit,
|
|
69
|
+
pages,
|
|
70
|
+
hasNext: withCount ? page < pages : false,
|
|
71
|
+
hasPrev: page > 1,
|
|
72
|
+
};
|
|
73
|
+
return { data, pagination };
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=queryBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryBuilder.js","sourceRoot":"","sources":["../../src/queryBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Model, PopulateOptions, ProjectionType } from 'mongoose';
|
|
2
|
+
export type SearchFieldType = 'string' | 'number' | 'exact';
|
|
3
|
+
export interface SearchFieldConfig {
|
|
4
|
+
field: string;
|
|
5
|
+
type?: SearchFieldType;
|
|
6
|
+
}
|
|
7
|
+
export type SearchField = string | SearchFieldConfig;
|
|
8
|
+
export interface DateFieldConfig {
|
|
9
|
+
field: string;
|
|
10
|
+
fromParam?: string;
|
|
11
|
+
toParam?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SoftDeleteConfig {
|
|
14
|
+
field: string;
|
|
15
|
+
value?: any;
|
|
16
|
+
}
|
|
17
|
+
export interface QueryBuilderOptions<T = any> {
|
|
18
|
+
model: Model<T>;
|
|
19
|
+
query: Record<string, any>;
|
|
20
|
+
searchFields?: SearchField[];
|
|
21
|
+
searchMode?: 'or' | 'and';
|
|
22
|
+
allowedFilters?: string[];
|
|
23
|
+
defaultSort?: string;
|
|
24
|
+
defaultOrder?: 'asc' | 'desc';
|
|
25
|
+
defaultLimit?: number;
|
|
26
|
+
maxLimit?: number;
|
|
27
|
+
populate?: string | string[] | PopulateOptions | PopulateOptions[];
|
|
28
|
+
select?: ProjectionType<T> | string;
|
|
29
|
+
dateField?: string;
|
|
30
|
+
dateFields?: DateFieldConfig[];
|
|
31
|
+
lean?: boolean;
|
|
32
|
+
customFilter?: Record<string, any>;
|
|
33
|
+
softDelete?: SoftDeleteConfig;
|
|
34
|
+
withCount?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface PaginationMeta {
|
|
37
|
+
total: number;
|
|
38
|
+
page: number;
|
|
39
|
+
limit: number;
|
|
40
|
+
pages: number;
|
|
41
|
+
hasNext: boolean;
|
|
42
|
+
hasPrev: boolean;
|
|
43
|
+
}
|
|
44
|
+
export interface QueryBuilderResult<T = any> {
|
|
45
|
+
data: T[];
|
|
46
|
+
pagination: PaginationMeta;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,iBAAiB,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,GAAG,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,GAAG;IAC1C,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,eAAe,GAAG,eAAe,EAAE,CAAC;IACnE,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,GAAG;IACzC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,UAAU,EAAE,cAAc,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FilterQuery } from 'mongoose';
|
|
2
|
+
/**
|
|
3
|
+
* Builds a MongoDB date-range filter for the specified field.
|
|
4
|
+
*
|
|
5
|
+
* - `from` maps to `$gte` (start of that day, as-is from the ISO string).
|
|
6
|
+
* - `to` maps to `$lte` (end of that day — time set to 23:59:59.999).
|
|
7
|
+
* - Invalid date strings are silently ignored.
|
|
8
|
+
* - Returns `{}` when no dateField is provided or both dates are invalid.
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildDateFilter(from: string | undefined, to: string | undefined, dateField: string | undefined): FilterQuery<any>;
|
|
11
|
+
//# sourceMappingURL=buildDateFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildDateFilter.d.ts","sourceRoot":"","sources":["../../../src/filters/buildDateFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAWvC;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,WAAW,CAAC,GAAG,CAAC,CAqBlB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Determines whether a given value produces a valid Date object.
|
|
3
|
+
*/
|
|
4
|
+
function isValidDate(value) {
|
|
5
|
+
if (!value || value.trim() === '')
|
|
6
|
+
return false;
|
|
7
|
+
const d = new Date(value);
|
|
8
|
+
return !isNaN(d.getTime());
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Builds a MongoDB date-range filter for the specified field.
|
|
12
|
+
*
|
|
13
|
+
* - `from` maps to `$gte` (start of that day, as-is from the ISO string).
|
|
14
|
+
* - `to` maps to `$lte` (end of that day — time set to 23:59:59.999).
|
|
15
|
+
* - Invalid date strings are silently ignored.
|
|
16
|
+
* - Returns `{}` when no dateField is provided or both dates are invalid.
|
|
17
|
+
*/
|
|
18
|
+
export function buildDateFilter(from, to, dateField) {
|
|
19
|
+
if (!dateField)
|
|
20
|
+
return {};
|
|
21
|
+
const conditions = {};
|
|
22
|
+
if (from && isValidDate(from)) {
|
|
23
|
+
conditions['$gte'] = new Date(from);
|
|
24
|
+
}
|
|
25
|
+
if (to && isValidDate(to)) {
|
|
26
|
+
const toDate = new Date(to);
|
|
27
|
+
// Set to end of day so the entire `to` day is included
|
|
28
|
+
toDate.setHours(23, 59, 59, 999);
|
|
29
|
+
conditions['$lte'] = toDate;
|
|
30
|
+
}
|
|
31
|
+
if (Object.keys(conditions).length === 0) {
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
34
|
+
return { [dateField]: conditions };
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=buildDateFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildDateFilter.js","sourceRoot":"","sources":["../../../src/filters/buildDateFilter.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAChD,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAwB,EACxB,EAAsB,EACtB,SAA6B;IAE7B,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,UAAU,GAAyB,EAAE,CAAC;IAE5C,IAAI,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,EAAE,IAAI,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,uDAAuD;QACvD,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QACjC,UAAU,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildDynamicFilters.d.ts","sourceRoot":"","sources":["../../../src/filters/buildDynamicFilters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAiE9C,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,cAAc,EAAE,MAAM,EAAE,GAAG,SAAS,EACpC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAChB,WAAW,CAAC,GAAG,CAAC,CAyClB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
const RESERVED_PARAMS = new Set([
|
|
2
|
+
'page', 'limit', 'sort', 'order', 'search', 'from', 'to', 'populate', 'select',
|
|
3
|
+
]);
|
|
4
|
+
const OPERATOR_SUFFIXES = [
|
|
5
|
+
['_exists', '$exists'],
|
|
6
|
+
['_regex', '$regex'],
|
|
7
|
+
['_nin', '$nin'],
|
|
8
|
+
['_gte', '$gte'],
|
|
9
|
+
['_lte', '$lte'],
|
|
10
|
+
['_ne', '$ne'],
|
|
11
|
+
['_in', '$in'],
|
|
12
|
+
['_gt', '$gt'],
|
|
13
|
+
['_lt', '$lt'],
|
|
14
|
+
];
|
|
15
|
+
function parseOperatorKey(key) {
|
|
16
|
+
for (const [suffix, op] of OPERATOR_SUFFIXES) {
|
|
17
|
+
if (key.endsWith(suffix) && key.length > suffix.length) {
|
|
18
|
+
return { field: key.slice(0, -suffix.length), op };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
function coerceScalar(raw) {
|
|
24
|
+
const str = String(raw);
|
|
25
|
+
if (str === 'true')
|
|
26
|
+
return true;
|
|
27
|
+
if (str === 'false')
|
|
28
|
+
return false;
|
|
29
|
+
const n = Number(str);
|
|
30
|
+
return isNaN(n) ? str : n;
|
|
31
|
+
}
|
|
32
|
+
function coerceForOperator(raw, op) {
|
|
33
|
+
const str = String(raw);
|
|
34
|
+
switch (op) {
|
|
35
|
+
case '$gte':
|
|
36
|
+
case '$lte':
|
|
37
|
+
case '$gt':
|
|
38
|
+
case '$lt': {
|
|
39
|
+
const n = Number(str);
|
|
40
|
+
return isNaN(n) ? str : n;
|
|
41
|
+
}
|
|
42
|
+
case '$ne':
|
|
43
|
+
return coerceScalar(raw);
|
|
44
|
+
case '$in':
|
|
45
|
+
case '$nin':
|
|
46
|
+
return str.split(',').map((v) => coerceScalar(v.trim()));
|
|
47
|
+
case '$exists':
|
|
48
|
+
return str !== 'false';
|
|
49
|
+
case '$regex': {
|
|
50
|
+
try {
|
|
51
|
+
return new RegExp(str, 'i');
|
|
52
|
+
}
|
|
53
|
+
catch (_a) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
default:
|
|
58
|
+
return coerceScalar(raw);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function buildDynamicFilters(query, allowedFilters, model) {
|
|
62
|
+
const filter = {};
|
|
63
|
+
const allowed = new Set(allowedFilters !== null && allowedFilters !== void 0 ? allowedFilters : []);
|
|
64
|
+
const schemaPaths = model.schema.paths;
|
|
65
|
+
for (const key of Object.keys(query)) {
|
|
66
|
+
if (RESERVED_PARAMS.has(key))
|
|
67
|
+
continue;
|
|
68
|
+
const raw = query[key];
|
|
69
|
+
if (raw === undefined || raw === null || raw === '')
|
|
70
|
+
continue;
|
|
71
|
+
const parsed = parseOperatorKey(key);
|
|
72
|
+
if (parsed) {
|
|
73
|
+
const { field, op } = parsed;
|
|
74
|
+
const fieldAllowed = allowed.has(field) || field in schemaPaths;
|
|
75
|
+
if (!fieldAllowed)
|
|
76
|
+
continue;
|
|
77
|
+
const coerced = coerceForOperator(raw, op);
|
|
78
|
+
if (coerced === null)
|
|
79
|
+
continue;
|
|
80
|
+
if (typeof filter[field] !== 'object' || Array.isArray(filter[field])) {
|
|
81
|
+
filter[field] = {};
|
|
82
|
+
}
|
|
83
|
+
filter[field][op] = coerced;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const keyAllowed = allowed.has(key) || key in schemaPaths;
|
|
87
|
+
if (!keyAllowed)
|
|
88
|
+
continue;
|
|
89
|
+
const value = String(raw);
|
|
90
|
+
if (value === 'true') {
|
|
91
|
+
filter[key] = true;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (value === 'false') {
|
|
95
|
+
filter[key] = false;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (value.includes(',')) {
|
|
99
|
+
filter[key] = { $in: value.split(',').map((v) => v.trim()) };
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
filter[key] = raw;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return filter;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=buildDynamicFilters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildDynamicFilters.js","sourceRoot":"","sources":["../../../src/filters/buildDynamicFilters.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ;CAC/E,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAuB;IAC5C,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,KAAK,EAAE,KAAK,CAAC;CACf,CAAC;AAEF,SAAS,gBAAgB,CAAC,GAAW;IACnC,KAAK,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,iBAAiB,EAAE,CAAC;QAC7C,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YACvD,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,GAAQ;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAQ,EAAE,EAAU;IAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAExB,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,MAAM,CAAC;QAAC,KAAK,MAAM,CAAC;QAAC,KAAK,KAAK,CAAC;QAAC,KAAK,KAAK,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,KAAK;YACR,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;QAE3B,KAAK,KAAK,CAAC;QAAC,KAAK,MAAM;YACrB,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE3D,KAAK,SAAS;YACZ,OAAO,GAAG,KAAK,OAAO,CAAC;QAEzB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC;gBACH,OAAO,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC9B,CAAC;YAAC,WAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED;YACE,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAA0B,EAC1B,cAAoC,EACpC,KAAiB;IAEjB,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAEvC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE;YAAE,SAAS;QAE9D,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;YAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,WAAW,CAAC;YAChE,IAAI,CAAC,YAAY;gBAAE,SAAS;YAE5B,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,OAAO,KAAK,IAAI;gBAAE,SAAS;YAE/B,IAAI,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACtE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACrB,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC;YAC1D,IAAI,CAAC,UAAU;gBAAE,SAAS;YAE1B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAAC,SAAS;YAAC,CAAC;YACvD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAAC,SAAS;YAAC,CAAC;YACzD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC7D,SAAS;YACX,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface PaginationParams {
|
|
2
|
+
page: number;
|
|
3
|
+
limit: number;
|
|
4
|
+
skip: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Parses and validates pagination query parameters.
|
|
8
|
+
*
|
|
9
|
+
* Rules:
|
|
10
|
+
* - `page` is clamped to a minimum of 1.
|
|
11
|
+
* - `limit` is clamped between 1 and `maxLimit` (inclusive).
|
|
12
|
+
* - Non-numeric or missing values fall back to the provided defaults.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildPagination(queryPage: string | undefined, queryLimit: string | undefined, defaultLimit: number, maxLimit: number): PaginationParams;
|
|
15
|
+
//# sourceMappingURL=buildPagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildPagination.d.ts","sourceRoot":"","sources":["../../../src/filters/buildPagination.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAgBlB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses and validates pagination query parameters.
|
|
3
|
+
*
|
|
4
|
+
* Rules:
|
|
5
|
+
* - `page` is clamped to a minimum of 1.
|
|
6
|
+
* - `limit` is clamped between 1 and `maxLimit` (inclusive).
|
|
7
|
+
* - Non-numeric or missing values fall back to the provided defaults.
|
|
8
|
+
*/
|
|
9
|
+
export function buildPagination(queryPage, queryLimit, defaultLimit, maxLimit) {
|
|
10
|
+
let page = parseInt(queryPage, 10);
|
|
11
|
+
let limit = parseInt(queryLimit, 10);
|
|
12
|
+
// Fall back to defaults for non-numeric inputs
|
|
13
|
+
if (isNaN(page))
|
|
14
|
+
page = 1;
|
|
15
|
+
if (isNaN(limit))
|
|
16
|
+
limit = defaultLimit;
|
|
17
|
+
// Enforce bounds
|
|
18
|
+
if (page < 1)
|
|
19
|
+
page = 1;
|
|
20
|
+
if (limit < 1)
|
|
21
|
+
limit = 1;
|
|
22
|
+
if (limit > maxLimit)
|
|
23
|
+
limit = maxLimit;
|
|
24
|
+
const skip = (page - 1) * limit;
|
|
25
|
+
return { page, limit, skip };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=buildPagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildPagination.js","sourceRoot":"","sources":["../../../src/filters/buildPagination.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,SAA6B,EAC7B,UAA8B,EAC9B,YAAoB,EACpB,QAAgB;IAEhB,IAAI,IAAI,GAAG,QAAQ,CAAC,SAAmB,EAAE,EAAE,CAAC,CAAC;IAC7C,IAAI,KAAK,GAAG,QAAQ,CAAC,UAAoB,EAAE,EAAE,CAAC,CAAC;IAE/C,+CAA+C;IAC/C,IAAI,KAAK,CAAC,IAAI,CAAC;QAAE,IAAI,GAAG,CAAC,CAAC;IAC1B,IAAI,KAAK,CAAC,KAAK,CAAC;QAAE,KAAK,GAAG,YAAY,CAAC;IAEvC,iBAAiB;IACjB,IAAI,IAAI,GAAG,CAAC;QAAE,IAAI,GAAG,CAAC,CAAC;IACvB,IAAI,KAAK,GAAG,CAAC;QAAE,KAAK,GAAG,CAAC,CAAC;IACzB,IAAI,KAAK,GAAG,QAAQ;QAAE,KAAK,GAAG,QAAQ,CAAC;IAEvC,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAEhC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildPopulate.d.ts","sourceRoot":"","sources":["../../../src/filters/buildPopulate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAmB3C,wBAAgB,aAAa,CAC3B,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,eAAe,GAAG,eAAe,EAAE,GAAG,SAAS,GAClF,eAAe,EAAE,CA2BnB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
function dotToPopulate(dotPath) {
|
|
2
|
+
const parts = dotPath
|
|
3
|
+
.trim()
|
|
4
|
+
.split('.')
|
|
5
|
+
.map((p) => p.trim())
|
|
6
|
+
.filter((p) => p.length > 0)
|
|
7
|
+
.slice(0, 4);
|
|
8
|
+
if (parts.length === 0)
|
|
9
|
+
throw new Error(`Invalid populate path: "${dotPath}"`);
|
|
10
|
+
let result = { path: parts[parts.length - 1] };
|
|
11
|
+
for (let i = parts.length - 2; i >= 0; i--) {
|
|
12
|
+
result = { path: parts[i], populate: result };
|
|
13
|
+
}
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
16
|
+
export function buildPopulate(queryPopulate, optionPopulate) {
|
|
17
|
+
if (queryPopulate && queryPopulate.trim() !== '') {
|
|
18
|
+
return queryPopulate
|
|
19
|
+
.split(',')
|
|
20
|
+
.map((p) => p.trim())
|
|
21
|
+
.filter((p) => p.length > 0)
|
|
22
|
+
.map(dotToPopulate);
|
|
23
|
+
}
|
|
24
|
+
if (optionPopulate === undefined || optionPopulate === null)
|
|
25
|
+
return [];
|
|
26
|
+
if (typeof optionPopulate === 'string') {
|
|
27
|
+
return optionPopulate.trim() === '' ? [] : [dotToPopulate(optionPopulate)];
|
|
28
|
+
}
|
|
29
|
+
if (Array.isArray(optionPopulate)) {
|
|
30
|
+
if (optionPopulate.length === 0)
|
|
31
|
+
return [];
|
|
32
|
+
if (typeof optionPopulate[0] === 'string') {
|
|
33
|
+
return optionPopulate
|
|
34
|
+
.map((p) => p.trim())
|
|
35
|
+
.filter((p) => p.length > 0)
|
|
36
|
+
.map(dotToPopulate);
|
|
37
|
+
}
|
|
38
|
+
return optionPopulate;
|
|
39
|
+
}
|
|
40
|
+
return [optionPopulate];
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=buildPopulate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildPopulate.js","sourceRoot":"","sources":["../../../src/filters/buildPopulate.ts"],"names":[],"mappings":"AAEA,SAAS,aAAa,CAAC,OAAe;IACpC,MAAM,KAAK,GAAG,OAAO;SAClB,IAAI,EAAE;SACN,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEf,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,GAAG,CAAC,CAAC;IAE/E,IAAI,MAAM,GAAoB,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;IAChE,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,aAAiC,EACjC,cAAmF;IAEnF,IAAI,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,OAAO,aAAa;aACjB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aAC3B,GAAG,CAAC,aAAa,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAEvE,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC3C,IAAI,OAAO,cAAc,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAQ,cAA2B;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;iBAC3B,GAAG,CAAC,aAAa,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,cAAmC,CAAC;IAC7C,CAAC;IAED,OAAO,CAAC,cAAiC,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { FilterQuery } from 'mongoose';
|
|
2
|
+
import { SearchField } from '../types';
|
|
3
|
+
export declare function buildSearch(search: string | undefined, searchFields: SearchField[] | undefined, searchMode?: 'or' | 'and'): FilterQuery<any>;
|
|
4
|
+
//# sourceMappingURL=buildSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildSearch.d.ts","sourceRoot":"","sources":["../../../src/filters/buildSearch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAgCvC,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,YAAY,EAAE,WAAW,EAAE,GAAG,SAAS,EACvC,UAAU,GAAE,IAAI,GAAG,KAAY,GAC9B,WAAW,CAAC,GAAG,CAAC,CA8BlB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
function escapeRegex(value) {
|
|
2
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
3
|
+
}
|
|
4
|
+
function buildFieldCondition(field, type, term) {
|
|
5
|
+
if (type === 'number') {
|
|
6
|
+
const num = Number(term);
|
|
7
|
+
if (isNaN(num))
|
|
8
|
+
return null;
|
|
9
|
+
return { [field]: { $eq: num } };
|
|
10
|
+
}
|
|
11
|
+
if (type === 'exact') {
|
|
12
|
+
return { [field]: term };
|
|
13
|
+
}
|
|
14
|
+
return { [field]: { $regex: new RegExp(escapeRegex(term), 'i') } };
|
|
15
|
+
}
|
|
16
|
+
function normaliseFields(searchFields) {
|
|
17
|
+
return searchFields.map((f) => {
|
|
18
|
+
var _a;
|
|
19
|
+
return typeof f === 'string'
|
|
20
|
+
? { field: f, type: 'string' }
|
|
21
|
+
: { field: f.field, type: (_a = f.type) !== null && _a !== void 0 ? _a : 'string' };
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export function buildSearch(search, searchFields, searchMode = 'or') {
|
|
25
|
+
if (!search || !searchFields || searchFields.length === 0)
|
|
26
|
+
return {};
|
|
27
|
+
const trimmed = search.trim();
|
|
28
|
+
if (trimmed.length === 0)
|
|
29
|
+
return {};
|
|
30
|
+
const fields = normaliseFields(searchFields);
|
|
31
|
+
if (searchMode === 'and') {
|
|
32
|
+
const terms = trimmed.split(/\s+/).filter((t) => t.length > 0);
|
|
33
|
+
const andClauses = [];
|
|
34
|
+
for (const term of terms) {
|
|
35
|
+
const orConds = fields
|
|
36
|
+
.map((f) => buildFieldCondition(f.field, f.type, term))
|
|
37
|
+
.filter((c) => c !== null);
|
|
38
|
+
if (orConds.length > 0)
|
|
39
|
+
andClauses.push({ $or: orConds });
|
|
40
|
+
}
|
|
41
|
+
if (andClauses.length === 0)
|
|
42
|
+
return {};
|
|
43
|
+
if (andClauses.length === 1)
|
|
44
|
+
return andClauses[0];
|
|
45
|
+
return { $and: andClauses };
|
|
46
|
+
}
|
|
47
|
+
const orConds = fields
|
|
48
|
+
.map((f) => buildFieldCondition(f.field, f.type, trimmed))
|
|
49
|
+
.filter((c) => c !== null);
|
|
50
|
+
if (orConds.length === 0)
|
|
51
|
+
return {};
|
|
52
|
+
return { $or: orConds };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=buildSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildSearch.js","sourceRoot":"","sources":["../../../src/filters/buildSearch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildSort.d.ts","sourceRoot":"","sources":["../../../src/filters/buildSort.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,KAAK,GAAG,MAAM,GAC3B,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAgBxB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function buildSort(querySort, queryOrder, defaultSort, defaultOrder) {
|
|
2
|
+
var _a;
|
|
3
|
+
const sortFields = ((querySort && querySort.trim()) || defaultSort)
|
|
4
|
+
.split(',')
|
|
5
|
+
.map((s) => s.trim())
|
|
6
|
+
.filter((s) => s.length > 0);
|
|
7
|
+
const orderParts = (queryOrder !== null && queryOrder !== void 0 ? queryOrder : '').split(',').map((o) => o.trim());
|
|
8
|
+
const result = {};
|
|
9
|
+
for (let i = 0; i < sortFields.length; i++) {
|
|
10
|
+
const rawOrder = (_a = orderParts[i]) !== null && _a !== void 0 ? _a : '';
|
|
11
|
+
const dir = rawOrder === 'asc' || rawOrder === 'desc' ? rawOrder : i === 0 ? defaultOrder : 'asc';
|
|
12
|
+
result[sortFields[i]] = dir === 'asc' ? 1 : -1;
|
|
13
|
+
}
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=buildSort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildSort.js","sourceRoot":"","sources":["../../../src/filters/buildSort.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CACvB,SAA6B,EAC7B,UAA8B,EAC9B,WAAmB,EACnB,YAA4B;;IAE5B,MAAM,UAAU,GAAG,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,WAAW,CAAC;SAChE,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEtE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAA,UAAU,CAAC,CAAC,CAAC,mCAAI,EAAE,CAAC;QACrC,MAAM,GAAG,GACP,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;QACxF,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|