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.
Files changed (76) hide show
  1. package/README.md +294 -0
  2. package/dist/cjs/filters/buildDateFilter.d.ts +11 -0
  3. package/dist/cjs/filters/buildDateFilter.d.ts.map +1 -0
  4. package/dist/cjs/filters/buildDateFilter.js +39 -0
  5. package/dist/cjs/filters/buildDateFilter.js.map +1 -0
  6. package/dist/cjs/filters/buildDynamicFilters.d.ts +3 -0
  7. package/dist/cjs/filters/buildDynamicFilters.d.ts.map +1 -0
  8. package/dist/cjs/filters/buildDynamicFilters.js +110 -0
  9. package/dist/cjs/filters/buildDynamicFilters.js.map +1 -0
  10. package/dist/cjs/filters/buildPagination.d.ts +15 -0
  11. package/dist/cjs/filters/buildPagination.d.ts.map +1 -0
  12. package/dist/cjs/filters/buildPagination.js +30 -0
  13. package/dist/cjs/filters/buildPagination.js.map +1 -0
  14. package/dist/cjs/filters/buildPopulate.d.ts +3 -0
  15. package/dist/cjs/filters/buildPopulate.d.ts.map +1 -0
  16. package/dist/cjs/filters/buildPopulate.js +45 -0
  17. package/dist/cjs/filters/buildPopulate.js.map +1 -0
  18. package/dist/cjs/filters/buildSearch.d.ts +4 -0
  19. package/dist/cjs/filters/buildSearch.d.ts.map +1 -0
  20. package/dist/cjs/filters/buildSearch.js +57 -0
  21. package/dist/cjs/filters/buildSearch.js.map +1 -0
  22. package/dist/cjs/filters/buildSort.d.ts +2 -0
  23. package/dist/cjs/filters/buildSort.d.ts.map +1 -0
  24. package/dist/cjs/filters/buildSort.js +19 -0
  25. package/dist/cjs/filters/buildSort.js.map +1 -0
  26. package/dist/cjs/index.d.ts +3 -0
  27. package/dist/cjs/index.d.ts.map +1 -0
  28. package/dist/cjs/index.js +6 -0
  29. package/dist/cjs/index.js.map +1 -0
  30. package/dist/cjs/package.json +3 -0
  31. package/dist/cjs/queryBuilder.d.ts +3 -0
  32. package/dist/cjs/queryBuilder.d.ts.map +1 -0
  33. package/dist/cjs/queryBuilder.js +75 -0
  34. package/dist/cjs/queryBuilder.js.map +1 -0
  35. package/dist/cjs/types.d.ts +48 -0
  36. package/dist/cjs/types.d.ts.map +1 -0
  37. package/dist/cjs/types.js +3 -0
  38. package/dist/cjs/types.js.map +1 -0
  39. package/dist/esm/filters/buildDateFilter.d.ts +11 -0
  40. package/dist/esm/filters/buildDateFilter.d.ts.map +1 -0
  41. package/dist/esm/filters/buildDateFilter.js +36 -0
  42. package/dist/esm/filters/buildDateFilter.js.map +1 -0
  43. package/dist/esm/filters/buildDynamicFilters.d.ts +3 -0
  44. package/dist/esm/filters/buildDynamicFilters.d.ts.map +1 -0
  45. package/dist/esm/filters/buildDynamicFilters.js +107 -0
  46. package/dist/esm/filters/buildDynamicFilters.js.map +1 -0
  47. package/dist/esm/filters/buildPagination.d.ts +15 -0
  48. package/dist/esm/filters/buildPagination.d.ts.map +1 -0
  49. package/dist/esm/filters/buildPagination.js +27 -0
  50. package/dist/esm/filters/buildPagination.js.map +1 -0
  51. package/dist/esm/filters/buildPopulate.d.ts +3 -0
  52. package/dist/esm/filters/buildPopulate.d.ts.map +1 -0
  53. package/dist/esm/filters/buildPopulate.js +42 -0
  54. package/dist/esm/filters/buildPopulate.js.map +1 -0
  55. package/dist/esm/filters/buildSearch.d.ts +4 -0
  56. package/dist/esm/filters/buildSearch.d.ts.map +1 -0
  57. package/dist/esm/filters/buildSearch.js +54 -0
  58. package/dist/esm/filters/buildSearch.js.map +1 -0
  59. package/dist/esm/filters/buildSort.d.ts +2 -0
  60. package/dist/esm/filters/buildSort.d.ts.map +1 -0
  61. package/dist/esm/filters/buildSort.js +16 -0
  62. package/dist/esm/filters/buildSort.js.map +1 -0
  63. package/dist/esm/index.d.ts +3 -0
  64. package/dist/esm/index.d.ts.map +1 -0
  65. package/dist/esm/index.js +2 -0
  66. package/dist/esm/index.js.map +1 -0
  67. package/dist/esm/package.json +3 -0
  68. package/dist/esm/queryBuilder.d.ts +3 -0
  69. package/dist/esm/queryBuilder.d.ts.map +1 -0
  70. package/dist/esm/queryBuilder.js +72 -0
  71. package/dist/esm/queryBuilder.js.map +1 -0
  72. package/dist/esm/types.d.ts +48 -0
  73. package/dist/esm/types.d.ts.map +1 -0
  74. package/dist/esm/types.js +2 -0
  75. package/dist/esm/types.js.map +1 -0
  76. 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,2 @@
1
+ export declare function buildSort(querySort: string | undefined, queryOrder: string | undefined, defaultSort: string, defaultOrder: 'asc' | 'desc'): Record<string, 1 | -1>;
2
+ //# sourceMappingURL=buildSort.d.ts.map
@@ -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,3 @@
1
+ export { queryBuilder } from './queryBuilder';
2
+ export type { QueryBuilderOptions, PaginationMeta, QueryBuilderResult, SearchField, SearchFieldConfig, SearchFieldType, DateFieldConfig, SoftDeleteConfig, } from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,3 @@
1
+ import { QueryBuilderOptions, QueryBuilderResult } from './types';
2
+ export declare function queryBuilder<T = any>(options: QueryBuilderOptions<T>): Promise<QueryBuilderResult<T>>;
3
+ //# sourceMappingURL=queryBuilder.d.ts.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -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,3 @@
1
+ import { FilterQuery, Model } from 'mongoose';
2
+ export declare function buildDynamicFilters(query: Record<string, any>, allowedFilters: string[] | undefined, model: Model<any>): FilterQuery<any>;
3
+ //# sourceMappingURL=buildDynamicFilters.d.ts.map
@@ -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":"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"}
@@ -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,3 @@
1
+ import { PopulateOptions } from 'mongoose';
2
+ export declare function buildPopulate(queryPopulate: string | undefined, optionPopulate: string | string[] | PopulateOptions | PopulateOptions[] | undefined): PopulateOptions[];
3
+ //# sourceMappingURL=buildPopulate.d.ts.map
@@ -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,2 @@
1
+ export declare function buildSort(querySort: string | undefined, queryOrder: string | undefined, defaultSort: string, defaultOrder: 'asc' | 'desc'): Record<string, 1 | -1>;
2
+ //# sourceMappingURL=buildSort.d.ts.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ export { queryBuilder } from './queryBuilder';
2
+ export type { QueryBuilderOptions, PaginationMeta, QueryBuilderResult, SearchField, SearchFieldConfig, SearchFieldType, DateFieldConfig, SoftDeleteConfig, } from './types';
3
+ //# sourceMappingURL=index.d.ts.map