next-data-kit 4.0.0 → 5.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 (65) hide show
  1. package/README.md +39 -0
  2. package/dist/{next-data-kit-DgLsBFv3.d.cts → action-DwiE6Cov.d.cts} +44 -5
  3. package/dist/{next-data-kit-DgLsBFv3.d.ts → action-DwiE6Cov.d.ts} +44 -5
  4. package/dist/client/components/data-kit-table.d.ts +1 -1
  5. package/dist/client/components/data-kit-table.d.ts.map +1 -1
  6. package/dist/client/components/data-kit-table.js.map +1 -1
  7. package/dist/client/hooks/usePagination.d.ts.map +1 -1
  8. package/dist/client/hooks/usePagination.js +1 -1
  9. package/dist/client/hooks/usePagination.js.map +1 -1
  10. package/dist/index.cjs +46 -49
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.cts +48 -42
  13. package/dist/index.d.ts +48 -42
  14. package/dist/index.js +46 -49
  15. package/dist/index.js.map +1 -1
  16. package/dist/server/utils.d.ts +52 -0
  17. package/dist/server/utils.d.ts.map +1 -0
  18. package/dist/server/utils.js +117 -0
  19. package/dist/server/utils.js.map +1 -0
  20. package/dist/server.cjs +47 -39
  21. package/dist/server.cjs.map +1 -1
  22. package/dist/server.d.cts +7 -38
  23. package/dist/server.d.ts +7 -38
  24. package/dist/server.js +47 -40
  25. package/dist/server.js.map +1 -1
  26. package/dist/types/{component.d.ts → client/component.d.ts} +3 -3
  27. package/dist/types/client/component.d.ts.map +1 -0
  28. package/dist/types/client/component.js.map +1 -0
  29. package/dist/types/{hook.d.ts → client/hook.d.ts} +1 -1
  30. package/dist/types/client/hook.d.ts.map +1 -0
  31. package/dist/types/client/hook.js.map +1 -0
  32. package/dist/types/client/selectable.d.ts.map +1 -0
  33. package/dist/types/client/selectable.js.map +1 -0
  34. package/dist/types/index.cjs +0 -11
  35. package/dist/types/index.cjs.map +1 -1
  36. package/dist/types/index.d.cts +5 -4
  37. package/dist/types/index.d.ts +5 -5
  38. package/dist/types/index.d.ts.map +1 -1
  39. package/dist/types/index.js +1 -1
  40. package/dist/types/index.js.map +1 -1
  41. package/dist/types/next-data-kit.d.ts +1 -5
  42. package/dist/types/next-data-kit.d.ts.map +1 -1
  43. package/dist/types/next-data-kit.js +1 -11
  44. package/dist/types/next-data-kit.js.map +1 -1
  45. package/dist/types/server/action.d.ts +43 -0
  46. package/dist/types/server/action.d.ts.map +1 -0
  47. package/dist/types/server/action.js +7 -0
  48. package/dist/types/server/action.js.map +1 -0
  49. package/dist/types/server/database/mongo.d.ts.map +1 -0
  50. package/dist/types/server/database/mongo.js.map +1 -0
  51. package/package.json +1 -1
  52. package/dist/types/component.d.ts.map +0 -1
  53. package/dist/types/component.js.map +0 -1
  54. package/dist/types/database/mongo.d.ts.map +0 -1
  55. package/dist/types/database/mongo.js.map +0 -1
  56. package/dist/types/hook.d.ts.map +0 -1
  57. package/dist/types/hook.js.map +0 -1
  58. package/dist/types/selectable.d.ts.map +0 -1
  59. package/dist/types/selectable.js.map +0 -1
  60. /package/dist/types/{component.js → client/component.js} +0 -0
  61. /package/dist/types/{hook.js → client/hook.js} +0 -0
  62. /package/dist/types/{selectable.d.ts → client/selectable.d.ts} +0 -0
  63. /package/dist/types/{selectable.js → client/selectable.js} +0 -0
  64. /package/dist/types/{database → server/database}/mongo.d.ts +0 -0
  65. /package/dist/types/{database → server/database}/mongo.js +0 -0
@@ -0,0 +1,52 @@
1
+ /**
2
+ * next-data-kit - Server Utilities
3
+ */
4
+ import type { TMongoFilterQuery, TSortEntry, TPaginationInfo } from '../types';
5
+ /**
6
+ * Check if a value is provided (not undefined, null, or empty string)
7
+ */
8
+ export declare const isProvided: (value: unknown) => boolean;
9
+ /**
10
+ * Get a nested value from an object by path (e.g., 'user.name')
11
+ */
12
+ export declare const getValueByPath: (obj: unknown, path: string) => unknown;
13
+ /**
14
+ * Check if a value matches exactly (supports array inclusion)
15
+ */
16
+ export declare const matchesExact: (rowValue: unknown, needle: unknown) => boolean;
17
+ /**
18
+ * Check if a value matches a regex-like pattern (case-insensitive)
19
+ */
20
+ export declare const matchesRegexLike: (rowValue: unknown, needle: unknown) => boolean;
21
+ /**
22
+ * Compare two values for sorting
23
+ */
24
+ export declare const compareValues: (a: unknown, b: unknown) => number;
25
+ /**
26
+ * Normalize and validate sort entries
27
+ */
28
+ export declare const normalizeSorts: (sorts: TSortEntry[] | undefined) => TSortEntry[];
29
+ /**
30
+ * Check if a key is safe (not a prototype pollution key)
31
+ */
32
+ export declare const isSafeKey: (key: string) => boolean;
33
+ /**
34
+ * Helper to escape regex special characters in a string
35
+ */
36
+ export declare const escapeRegex: (str: string) => string;
37
+ /**
38
+ * Create a search filter for multiple fields
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * filterCustom: {
43
+ * search: createSearchFilter(['name', 'email', 'phone'])
44
+ * }
45
+ * ```
46
+ */
47
+ export declare const createSearchFilter: <T>(fields: (keyof T | string)[]) => ((value: unknown) => TMongoFilterQuery<T>);
48
+ /**
49
+ * Calculate pagination info from page, limit, and total
50
+ */
51
+ export declare const calculatePagination: (page: number, limit: number, total: number) => TPaginationInfo;
52
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE/E;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,KAAG,OAAgE,CAAC;AAE7G;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,KAAK,OAAO,EAAE,MAAM,MAAM,KAAG,OAY3D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,UAAU,OAAO,EAAE,QAAQ,OAAO,KAAG,OAGjE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU,OAAO,EAAE,QAAQ,OAAO,KAAG,OAQrE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,GAAG,OAAO,EAAE,GAAG,OAAO,KAAG,MAWtD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,UAAU,EAAE,GAAG,SAAS,KAAG,UAAU,EAAqG,CAAC;AAEjL;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,KAAG,OAGvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,KAAG,MAEzC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,KAAG,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,iBAAiB,CAAC,CAAC,CAAC,CAa7G,CAAC;AACF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,eAO/E,CAAC"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * next-data-kit - Server Utilities
3
+ */
4
+ /**
5
+ * Check if a value is provided (not undefined, null, or empty string)
6
+ */
7
+ export const isProvided = (value) => value !== undefined && value !== null && value !== '';
8
+ /**
9
+ * Get a nested value from an object by path (e.g., 'user.name')
10
+ */
11
+ export const getValueByPath = (obj, path) => {
12
+ if (!path)
13
+ return undefined;
14
+ const parts = path.split('.');
15
+ let current = obj;
16
+ for (const part of parts) {
17
+ if (current && typeof current === 'object' && part in current) {
18
+ current = current[part];
19
+ }
20
+ else {
21
+ return undefined;
22
+ }
23
+ }
24
+ return current;
25
+ };
26
+ /**
27
+ * Check if a value matches exactly (supports array inclusion)
28
+ */
29
+ export const matchesExact = (rowValue, needle) => {
30
+ if (Array.isArray(needle))
31
+ return needle.includes(rowValue);
32
+ return rowValue === needle;
33
+ };
34
+ /**
35
+ * Check if a value matches a regex-like pattern (case-insensitive)
36
+ */
37
+ export const matchesRegexLike = (rowValue, needle) => {
38
+ if (!isProvided(needle))
39
+ return true;
40
+ if (rowValue === undefined || rowValue === null)
41
+ return false;
42
+ const hay = String(rowValue);
43
+ if (needle instanceof RegExp)
44
+ return needle.test(hay);
45
+ const n = String(needle);
46
+ return hay.toLowerCase().includes(n.toLowerCase());
47
+ };
48
+ /**
49
+ * Compare two values for sorting
50
+ */
51
+ export const compareValues = (a, b) => {
52
+ if (a === b)
53
+ return 0;
54
+ if (a === undefined || a === null)
55
+ return -1;
56
+ if (b === undefined || b === null)
57
+ return 1;
58
+ if (typeof a === 'number' && typeof b === 'number')
59
+ return a - b;
60
+ if (typeof a === 'bigint' && typeof b === 'bigint')
61
+ return a < b ? -1 : 1;
62
+ const as = String(a);
63
+ const bs = String(b);
64
+ return as.localeCompare(bs);
65
+ };
66
+ /**
67
+ * Normalize and validate sort entries
68
+ */
69
+ export const normalizeSorts = (sorts) => (Array.isArray(sorts) ? sorts.filter(s => !!s?.path && (s.value === 1 || s.value === -1)) : []);
70
+ /**
71
+ * Check if a key is safe (not a prototype pollution key)
72
+ */
73
+ export const isSafeKey = (key) => {
74
+ const unsafeKeys = ['__proto__', 'constructor', 'prototype'];
75
+ return !unsafeKeys.includes(key);
76
+ };
77
+ /**
78
+ * Helper to escape regex special characters in a string
79
+ */
80
+ export const escapeRegex = (str) => {
81
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
82
+ };
83
+ /**
84
+ * Create a search filter for multiple fields
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * filterCustom: {
89
+ * search: createSearchFilter(['name', 'email', 'phone'])
90
+ * }
91
+ * ```
92
+ */
93
+ export const createSearchFilter = (fields) => {
94
+ return (value) => {
95
+ if (!value || typeof value !== 'string') {
96
+ return {};
97
+ }
98
+ const escapedValue = escapeRegex(value);
99
+ return {
100
+ $or: fields.map(field => ({
101
+ [field]: { $regex: escapedValue, $options: 'i' },
102
+ })),
103
+ };
104
+ };
105
+ };
106
+ /**
107
+ * Calculate pagination info from page, limit, and total
108
+ */
109
+ export const calculatePagination = (page, limit, total) => ({
110
+ currentPage: page,
111
+ totalPages: Math.ceil(total / limit),
112
+ totalItems: total,
113
+ itemsPerPage: limit,
114
+ hasNextPage: page * limit < total,
115
+ hasPrevPage: page > 1,
116
+ });
117
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;AAE7G;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAY,EAAE,IAAY,EAAW,EAAE;IACrE,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,OAAO,GAAY,GAAG,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,IAAI,IAAK,OAAmC,EAAE,CAAC;YAC5F,OAAO,GAAI,OAAmC,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACP,OAAO,SAAS,CAAC;QAClB,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAiB,EAAE,MAAe,EAAW,EAAE;IAC3E,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAiB,CAAC,CAAC;IACrE,OAAO,QAAQ,KAAK,MAAM,CAAC;AAC5B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAiB,EAAE,MAAe,EAAW,EAAE;IAC/E,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE7B,IAAI,MAAM,YAAY,MAAM;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAU,EAAE,CAAU,EAAU,EAAE;IAC/D,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IAE5C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1E,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAA+B,EAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAEjL;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAW,EAAW,EAAE;IACjD,MAAM,UAAU,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IAC7D,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE;IAClD,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAI,MAA4B,EAA8C,EAAE;IACjH,OAAO,CAAC,KAAc,EAAwB,EAAE;QAC/C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO,EAA0B,CAAC;QACnC,CAAC;QAED,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO;YACN,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACzB,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE;aAChD,CAAC,CAAC;SACqB,CAAC;IAC3B,CAAC,CAAC;AACH,CAAC,CAAC;AACF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,KAAa,EAAmB,EAAE,CAAC,CAAC;IACpG,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpC,UAAU,EAAE,KAAK;IACjB,YAAY,EAAE,KAAK;IACnB,WAAW,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK;IACjC,WAAW,EAAE,IAAI,GAAG,CAAC;CACrB,CAAC,CAAC"}
package/dist/server.cjs CHANGED
@@ -4,6 +4,42 @@ var zod = require('zod');
4
4
 
5
5
  // src/server/utils.ts
6
6
  var isProvided = (value) => value !== void 0 && value !== null && value !== "";
7
+ var getValueByPath = (obj, path) => {
8
+ if (!path) return void 0;
9
+ const parts = path.split(".");
10
+ let current = obj;
11
+ for (const part of parts) {
12
+ if (current && typeof current === "object" && part in current) {
13
+ current = current[part];
14
+ } else {
15
+ return void 0;
16
+ }
17
+ }
18
+ return current;
19
+ };
20
+ var matchesExact = (rowValue, needle) => {
21
+ if (Array.isArray(needle)) return needle.includes(rowValue);
22
+ return rowValue === needle;
23
+ };
24
+ var matchesRegexLike = (rowValue, needle) => {
25
+ if (!isProvided(needle)) return true;
26
+ if (rowValue === void 0 || rowValue === null) return false;
27
+ const hay = String(rowValue);
28
+ if (needle instanceof RegExp) return needle.test(hay);
29
+ const n = String(needle);
30
+ return hay.toLowerCase().includes(n.toLowerCase());
31
+ };
32
+ var compareValues = (a, b) => {
33
+ if (a === b) return 0;
34
+ if (a === void 0 || a === null) return -1;
35
+ if (b === void 0 || b === null) return 1;
36
+ if (typeof a === "number" && typeof b === "number") return a - b;
37
+ if (typeof a === "bigint" && typeof b === "bigint") return a < b ? -1 : 1;
38
+ const as = String(a);
39
+ const bs = String(b);
40
+ return as.localeCompare(bs);
41
+ };
42
+ var normalizeSorts = (sorts) => Array.isArray(sorts) ? sorts.filter((s) => !!s?.path && (s.value === 1 || s.value === -1)) : [];
7
43
  var isSafeKey = (key) => {
8
44
  const unsafeKeys = ["__proto__", "constructor", "prototype"];
9
45
  return !unsafeKeys.includes(key);
@@ -24,6 +60,14 @@ var createSearchFilter = (fields) => {
24
60
  };
25
61
  };
26
62
  };
63
+ var calculatePagination = (page, limit, total) => ({
64
+ currentPage: page,
65
+ totalPages: Math.ceil(total / limit),
66
+ totalItems: total,
67
+ itemsPerPage: limit,
68
+ hasNextPage: page * limit < total,
69
+ hasPrevPage: page > 1
70
+ });
27
71
 
28
72
  // src/server/adapters/mongoose.ts
29
73
  var mongooseAdapter = (model, options = {}) => {
@@ -178,43 +222,6 @@ async function dataKitServerAction(props) {
178
222
  }
179
223
 
180
224
  // src/server/adapters/memory.ts
181
- var isProvided2 = (value) => value !== void 0 && value !== null && value !== "";
182
- var getValueByPath = (obj, path) => {
183
- if (!path) return void 0;
184
- const parts = path.split(".");
185
- let current = obj;
186
- for (const part of parts) {
187
- if (current && typeof current === "object" && part in current) {
188
- current = current[part];
189
- } else {
190
- return void 0;
191
- }
192
- }
193
- return current;
194
- };
195
- var matchesExact = (rowValue, needle) => {
196
- if (Array.isArray(needle)) return needle.includes(rowValue);
197
- return rowValue === needle;
198
- };
199
- var matchesRegexLike = (rowValue, needle) => {
200
- if (!isProvided2(needle)) return true;
201
- if (rowValue === void 0 || rowValue === null) return false;
202
- const hay = String(rowValue);
203
- if (needle instanceof RegExp) return needle.test(hay);
204
- const n = String(needle);
205
- return hay.toLowerCase().includes(n.toLowerCase());
206
- };
207
- var compareValues = (a, b) => {
208
- if (a === b) return 0;
209
- if (a === void 0 || a === null) return -1;
210
- if (b === void 0 || b === null) return 1;
211
- if (typeof a === "number" && typeof b === "number") return a - b;
212
- if (typeof a === "bigint" && typeof b === "bigint") return a < b ? -1 : 1;
213
- const as = String(a);
214
- const bs = String(b);
215
- return as.localeCompare(bs);
216
- };
217
- var normalizeSorts = (sorts) => Array.isArray(sorts) ? sorts.filter((s) => !!s?.path && (s.value === 1 || s.value === -1)) : [];
218
225
  var adapterMemory = (dataset, options = {}) => {
219
226
  const { defaultFilterType = "exact" } = options;
220
227
  return async ({ filter, sorts, limit, skip, input }) => {
@@ -222,7 +229,7 @@ var adapterMemory = (dataset, options = {}) => {
222
229
  const query = input.query ?? {};
223
230
  let rows = dataset.filter((row) => {
224
231
  for (const [key, value] of Object.entries(query)) {
225
- if (!isProvided2(value)) continue;
232
+ if (!isProvided(value)) continue;
226
233
  const rowValue = getValueByPath(row, key);
227
234
  if (!matchesExact(rowValue, value)) return false;
228
235
  }
@@ -231,7 +238,7 @@ var adapterMemory = (dataset, options = {}) => {
231
238
  const effectiveFilter = filter ?? {};
232
239
  rows = rows.filter((row) => {
233
240
  for (const [key, value] of Object.entries(effectiveFilter)) {
234
- if (!isProvided2(value)) continue;
241
+ if (!isProvided(value)) continue;
235
242
  const config = filterConfig?.[key];
236
243
  const field = config?.field ?? key;
237
244
  const rowValue = getValueByPath(row, field);
@@ -285,6 +292,7 @@ var dataKitSchemaZod = zod.z.object({
285
292
  });
286
293
 
287
294
  exports.adapterMemory = adapterMemory;
295
+ exports.calculatePagination = calculatePagination;
288
296
  exports.createSearchFilter = createSearchFilter;
289
297
  exports.dataKitSchemaZod = dataKitSchemaZod;
290
298
  exports.dataKitServerAction = dataKitServerAction;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server/utils.ts","../src/server/adapters/mongoose.ts","../src/server/action.ts","../src/server/adapters/memory.ts","../src/server/schema.ts"],"names":["isProvided","z"],"mappings":"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","file":"server.cjs","sourcesContent":["/**\n * next-data-kit - Server Utilities\n */\n\nimport type { TMongoFilterQuery } from '../types';\n\n/**\n * Check if a value is provided (not undefined, null, or empty string)\n */\nexport const isProvided = (value: unknown): boolean => value !== undefined && value !== null && value !== '';\n\n/**\n * Check if a key is safe (not a prototype pollution key)\n */\nexport const isSafeKey = (key: string): boolean => {\n\tconst unsafeKeys = ['__proto__', 'constructor', 'prototype'];\n\treturn !unsafeKeys.includes(key);\n};\n\n/**\n * Helper to escape regex special characters in a string\n */\nexport const escapeRegex = (str: string): string => {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n};\n\n/**\n * Create a search filter for multiple fields\n *\n * @example\n * ```typescript\n * filterCustom: {\n * search: createSearchFilter(['name', 'email', 'phone'])\n * }\n * ```\n */\nexport const createSearchFilter = <T>(fields: (keyof T | string)[]): ((value: unknown) => TMongoFilterQuery<T>) => {\n\treturn (value: unknown): TMongoFilterQuery<T> => {\n\t\tif (!value || typeof value !== 'string') {\n\t\t\treturn {} as TMongoFilterQuery<T>;\n\t\t}\n\n\t\tconst escapedValue = escapeRegex(value);\n\t\treturn {\n\t\t\t$or: fields.map(field => ({\n\t\t\t\t[field]: { $regex: escapedValue, $options: 'i' },\n\t\t\t})),\n\t\t} as TMongoFilterQuery<T>;\n\t};\n};\n","/**\n * next-data-kit - Mongoose Adapter\n *\n * Database adapter for Mongoose/MongoDB.\n */\n\nimport type { TMongoModel, TMongoFilterQuery, TSortOrder, TSortOptions, TFilterCustomConfigWithFilter, TDataKitAdapter } from '../../types';\nimport { escapeRegex, isProvided, isSafeKey } from '../utils';\n\nexport const mongooseAdapter = <DocType = unknown>(\n\tmodel: TMongoModel<DocType>,\n\toptions: Readonly<{\n\t\tfilter?: (filterInput?: Record<string, unknown>) => TMongoFilterQuery<DocType>;\n\t\tfilterCustom?: TFilterCustomConfigWithFilter<DocType, TMongoFilterQuery<DocType>>;\n\t\tdefaultSort?: TSortOptions<DocType>;\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t[key: string]: any;\n\t}> = {},\n): TDataKitAdapter<DocType> => {\n\t// ** Deconstruct options\n\tconst { filter: customFilterFn, filterCustom, defaultSort = { _id: -1 } as TSortOptions<DocType> } = options;\n\n\treturn async ({ filter, sorts, limit, skip, input }) => {\n\t\t// ** Normalize sort\n\t\tlet sortOption: Record<string, TSortOrder>;\n\n\t\tif (input.sort && Object.keys(input.sort).length > 0) {\n\t\t\tsortOption = input.sort as Record<string, TSortOrder>;\n\t\t} else if (sorts && sorts.length > 0) {\n\t\t\tsortOption = sorts.reduce<Record<string, TSortOrder>>((acc, s) => {\n\t\t\t\tif (s?.path && (s.value === 1 || s.value === -1)) {\n\t\t\t\t\tacc[s.path] = s.value;\n\t\t\t\t}\n\t\t\t\treturn acc;\n\t\t\t}, {});\n\t\t} else {\n\t\t\tsortOption = defaultSort as Record<string, TSortOrder>;\n\t\t}\n\n\t\t// ** Construct filter query\n\t\tlet filterQuery: TMongoFilterQuery<DocType> = {};\n\n\t\t// ** Query params (exact match)\n\t\tif (input.query) {\n\t\t\tObject.entries(input.query).forEach(([key, value]) => {\n\t\t\t\tif (isProvided(value) && isSafeKey(key)) {\n\t\t\t\t\t(filterQuery as Record<string, unknown>)[key] = value;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// ** Custom filter function\n\t\tif (customFilterFn) {\n\t\t\tconst customQuery = customFilterFn(filter);\n\t\t\tfilterQuery = { ...filterQuery, ...customQuery };\n\t\t}\n\n\t\t// ** User defined filters\n\t\tif (filter && !customFilterFn) {\n\t\t\tif (input.filterConfig) {\n\t\t\t\tObject.entries(filter).forEach(([key, value]) => {\n\t\t\t\t\tif (isProvided(value) && isSafeKey(key) && input.filterConfig?.[key]) {\n\t\t\t\t\t\tconst config = input.filterConfig[key];\n\t\t\t\t\t\tconst fieldName = config?.field ?? key;\n\n\t\t\t\t\t\tif (config?.type === 'REGEX') {\n\t\t\t\t\t\t\t(filterQuery as Record<string, unknown>)[fieldName] = {\n\t\t\t\t\t\t\t\t$regex: escapeRegex(String(value)),\n\t\t\t\t\t\t\t\t$options: 'i',\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else if (config?.type === 'EXACT') {\n\t\t\t\t\t\t\t(filterQuery as Record<string, unknown>)[fieldName] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// ** Default automatic filtering\n\t\t\t\tObject.entries(filter).forEach(([key, value]) => {\n\t\t\t\t\tif (isProvided(value) && isSafeKey(key)) {\n\t\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\t\t(filterQuery as Record<string, unknown>)[key] = {\n\t\t\t\t\t\t\t\t$regex: escapeRegex(value),\n\t\t\t\t\t\t\t\t$options: 'i',\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else if (typeof value === 'number' || typeof value === 'boolean') {\n\t\t\t\t\t\t\t(filterQuery as Record<string, unknown>)[key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// ** Custom filter logic (filterCustom)\n\t\tif (filterCustom && filter) {\n\t\t\tObject.entries(filter).forEach(([key, value]) => {\n\t\t\t\tif (isProvided(value) && isSafeKey(key) && filterCustom[key]) {\n\t\t\t\t\tconst customFilter = filterCustom[key]!(value);\n\t\t\t\t\tfilterQuery = { ...filterQuery, ...customFilter };\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// ** Execute queries\n\t\tconst total = await model.countDocuments(filterQuery as TMongoFilterQuery<unknown>);\n\t\tconst items = (await model\n\t\t\t.find(filterQuery as TMongoFilterQuery<unknown>)\n\t\t\t.sort(sortOption)\n\t\t\t.limit(limit)\n\t\t\t.skip(skip)) as unknown as DocType[];\n\n\t\treturn { items, total };\n\t};\n};\n","/**\n * next-data-kit - Server Action\n *\n * The main server-side function for handling table data fetching\n * with pagination, filtering, and sorting.\n */\n\nimport { mongooseAdapter } from './adapters/mongoose';\nimport type { Model } from 'mongoose';\nimport type { TDataKitInput, TDataKitResult, TDataKitAdapter, TMongoModel, TMongoFilterQuery, TFilterCustomConfigWithFilter, TSortOptions } from '../types';\n\n/**\n * Extract document type from a Mongoose Model.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type TExtractDocType<M> = M extends Model<infer TRawDocType, any, any, any, any, any> ? TRawDocType : never;\n\n/**\n * Base options shared by both mongoose and adapter versions\n */\ntype TBaseOptions<TDoc, R> = {\n\tinput: TDataKitInput<TDoc>;\n\titem: (item: TDoc) => Promise<R> | R;\n\tfilterAllowed?: string[];\n\tmaxLimit?: number;\n\tqueryAllowed?: (keyof TDoc | string)[];\n};\n\n/**\n * Options when using a Mongoose model\n */\ntype TMongooseOptions<M, TDoc, R> = TBaseOptions<TDoc, R> & {\n\tmodel: M;\n\tadapter?: never;\n\tfilter?: (filterInput?: Record<string, unknown>) => TMongoFilterQuery<TDoc>;\n\tfilterCustom?: TFilterCustomConfigWithFilter<TDoc, TMongoFilterQuery<TDoc>>;\n\tdefaultSort?: TSortOptions<TDoc>;\n};\n\n/**\n * Options when using a custom adapter\n */\ntype TAdapterOptions<TDoc, R> = TBaseOptions<TDoc, R> & {\n\tadapter: TDataKitAdapter<TDoc>;\n\tmodel?: never;\n\tfilter?: never;\n\tfilterCustom?: TFilterCustomConfigWithFilter<TDoc, unknown>;\n\tdefaultSort?: never;\n};\n\n/**\n * Core execution logic shared by both overloads\n */\nasync function executeDataKit<TDoc, R>(input: TDataKitInput<TDoc>, adapter: TDataKitAdapter<TDoc>, item: (item: TDoc) => Promise<R> | R, maxLimit: number, filterAllowed?: string[], queryAllowed?: (keyof TDoc | string)[]): Promise<TDataKitResult<R>> {\n\t// Check Query\n\tif (input.query) {\n\t\tconst safeQuery: Record<string, string | number | boolean> = {};\n\t\tObject.keys(input.query).forEach(key => {\n\t\t\tif (queryAllowed && !queryAllowed.includes(key)) {\n\t\t\t\tthrow new Error(`[Security] Query field '${key}' is not allowed.`);\n\t\t\t}\n\t\t\tconst val = input.query![key];\n\t\t\tif (val !== null && typeof val === 'object') {\n\t\t\t\tthrow new Error(`[Security] Query value for '${key}' must be a primitive.`);\n\t\t\t}\n\t\t\tif (val !== undefined) {\n\t\t\t\tsafeQuery[key] = val;\n\t\t\t}\n\t\t});\n\t\tinput.query = safeQuery;\n\t}\n\n\t// Check Filter\n\tif (input.filter) {\n\t\tconst safeFilter: Record<string, unknown> = {};\n\t\tObject.keys(input.filter).forEach(key => {\n\t\t\tif (filterAllowed && !filterAllowed.includes(key)) {\n\t\t\t\tthrow new Error(`[Security] Filter field '${key}' is not allowed.`);\n\t\t\t}\n\t\t\tconst val = input.filter![key];\n\t\t\tif (val !== null && typeof val === 'object') {\n\t\t\t\tthrow new Error(`[Security] Filter value for '${key}' must be a primitive.`);\n\t\t\t}\n\t\t\tsafeFilter[key] = val;\n\t\t});\n\t\tinput.filter = safeFilter;\n\t}\n\n\t// Handle action\n\tswitch (input.action ?? 'FETCH') {\n\t\tcase 'FETCH': {\n\t\t\tif (!input.limit || !input.page) {\n\t\t\t\tthrow new Error('Invalid input: missing limit or page');\n\t\t\t}\n\n\t\t\tconst limit = Math.min(input.limit, maxLimit);\n\t\t\tconst skip = limit * (input.page - 1);\n\n\t\t\tconst { items, total } = await adapter({\n\t\t\t\tfilter: input.filter ?? {},\n\t\t\t\tsorts: input.sorts ?? [],\n\t\t\t\tlimit,\n\t\t\t\tpage: input.page,\n\t\t\t\tskip,\n\t\t\t\tinput,\n\t\t\t});\n\n\t\t\tconst processedItems = await Promise.all(items.map(dataItem => item(dataItem)));\n\n\t\t\treturn {\n\t\t\t\ttype: 'ITEMS',\n\t\t\t\titems: processedItems,\n\t\t\t\tdocumentTotal: total,\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported action: ${(input as { action?: string }).action}`);\n\t}\n}\n\n/**\n * Server action with Mongoose model (auto-infers document type)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function dataKitServerAction<M extends Model<any>, R = unknown>(props: Readonly<TMongooseOptions<M, TExtractDocType<M>, R>>): Promise<TDataKitResult<R>>;\n\n/**\n * Server action with custom adapter\n */\nexport async function dataKitServerAction<TDoc, R = unknown>(props: Readonly<TAdapterOptions<TDoc, R>>): Promise<TDataKitResult<R>>;\n\n/**\n * Implementation\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function dataKitServerAction<M extends Model<any>, TDoc = any, R = unknown>(props: Readonly<TMongooseOptions<M, TDoc, R> | TAdapterOptions<TDoc, R>>): Promise<TDataKitResult<R>> {\n\tconst { input, item, maxLimit = 100, queryAllowed, filterAllowed: explicitFilterAllowed } = props;\n\n\t// Determine filterAllowed\n\tconst filterCustom = 'filterCustom' in props ? props.filterCustom : undefined;\n\tconst filterAllowed = explicitFilterAllowed ?? (filterCustom ? Object.keys(filterCustom) : undefined);\n\n\t// Determine adapter\n\tlet finalAdapter: TDataKitAdapter<TDoc>;\n\n\tif ('adapter' in props && props.adapter) {\n\t\tfinalAdapter = props.adapter;\n\t} else if ('model' in props && props.model) {\n\t\tconst model = props.model as unknown as TMongoModel<TDoc>;\n\t\tfinalAdapter = mongooseAdapter(model, {\n\t\t\tfilter: props.filter,\n\t\t\tfilterCustom: props.filterCustom,\n\t\t\tdefaultSort: props.defaultSort,\n\t\t}) as TDataKitAdapter<TDoc>;\n\t} else {\n\t\tthrow new Error('Either model or adapter must be provided');\n\t}\n\n\treturn executeDataKit(input, finalAdapter, item, maxLimit, filterAllowed, queryAllowed);\n}\n","/**\n * next-data-kit - Memory Adapter\n *\n * In-memory adapter for demos, tests, and local playgrounds.\n * Implements the React Data Kit adapter contract over an array dataset.\n */\n\nimport type { TFilterConfig, TSortEntry, TDataKitAdapter } from '../../types';\n\nconst isProvided = (value: unknown): boolean =>\n value !== undefined && value !== null && value !== '';\n\nconst getValueByPath = (obj: unknown, path: string): unknown => {\n if (!path) return undefined;\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current && typeof current === 'object' && part in (current as Record<string, unknown>)) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return current;\n};\n\nconst matchesExact = (rowValue: unknown, needle: unknown): boolean => {\n if (Array.isArray(needle)) return needle.includes(rowValue as never);\n return rowValue === needle;\n};\n\nconst matchesRegexLike = (rowValue: unknown, needle: unknown): boolean => {\n if (!isProvided(needle)) return true;\n if (rowValue === undefined || rowValue === null) return false;\n const hay = String(rowValue);\n\n if (needle instanceof RegExp) return needle.test(hay);\n const n = String(needle);\n return hay.toLowerCase().includes(n.toLowerCase());\n};\n\nconst compareValues = (a: unknown, b: unknown): number => {\n if (a === b) return 0;\n if (a === undefined || a === null) return -1;\n if (b === undefined || b === null) return 1;\n\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'bigint' && typeof b === 'bigint') return a < b ? -1 : 1;\n\n const as = String(a);\n const bs = String(b);\n return as.localeCompare(bs);\n};\n\nconst normalizeSorts = (sorts: TSortEntry[] | undefined): TSortEntry[] =>\n Array.isArray(sorts) ? sorts.filter((s) => !!s?.path && (s.value === 1 || s.value === -1)) : [];\n\n/**\n * Creates an adapter that pages/filters/sorts an in-memory dataset.\n */\nexport const adapterMemory = <T extends Record<string, unknown>>(\n dataset: ReadonlyArray<T>,\n options: Readonly<{\n /** default behavior for filter keys not present in filterConfig */\n defaultFilterType?: 'regex' | 'exact';\n }> = {}\n): TDataKitAdapter<T> => {\n const { defaultFilterType = 'exact' } = options;\n\n return async ({ filter, sorts, limit, skip, input }) => {\n const filterConfig: TFilterConfig | undefined = input.filterConfig;\n const query = input.query ?? {};\n\n // 1) Apply query (exact match)\n let rows = dataset.filter((row) => {\n for (const [key, value] of Object.entries(query)) {\n if (!isProvided(value)) continue;\n const rowValue = getValueByPath(row, key);\n if (!matchesExact(rowValue, value)) return false;\n }\n return true;\n });\n\n // 2) Apply filter (via filterConfig when present)\n const effectiveFilter = filter ?? {};\n rows = rows.filter((row) => {\n for (const [key, value] of Object.entries(effectiveFilter)) {\n if (!isProvided(value)) continue;\n\n const config = filterConfig?.[key];\n const field = config?.field ?? key;\n const rowValue = getValueByPath(row, field);\n\n const type = config?.type ?? defaultFilterType;\n if (type === 'regex') {\n if (!matchesRegexLike(rowValue, value)) return false;\n } else {\n if (!matchesExact(rowValue, value)) return false;\n }\n }\n return true;\n });\n\n // 3) Sort\n const normalizedSorts = normalizeSorts(sorts);\n if (normalizedSorts.length > 0) {\n rows = [...rows].sort((ra, rb) => {\n for (const s of normalizedSorts) {\n const av = getValueByPath(ra, s.path);\n const bv = getValueByPath(rb, s.path);\n const cmp = compareValues(av, bv);\n if (cmp !== 0) return s.value === 1 ? cmp : -cmp;\n }\n return 0;\n });\n }\n\n const total = rows.length;\n const items = rows.slice(skip, skip + limit);\n return { items, total };\n };\n};\n","import { z } from 'zod';\n\nexport const dataKitSchemaZod = z.object({\n\tpage: z.number().int().positive().optional(),\n\tlimit: z.number().int().positive().optional(),\n\tquery: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n\tfilter: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])).optional(),\n\tfilterConfig: z\n\t\t.record(\n\t\t\tz.string(),\n\t\t\tz.object({\n\t\t\t\ttype: z.enum(['REGEX', 'EXACT']),\n\t\t\t\tfield: z.string().optional(),\n\t\t\t}),\n\t\t)\n\t\t.optional(),\n\tsorts: z\n\t\t.array(\n\t\t\tz.object({\n\t\t\t\tpath: z.string().max(100), // Limit path length to prevent abuse\n\t\t\t\tvalue: z.literal(-1).or(z.literal(1)),\n\t\t\t}),\n\t\t)\n\t\t.max(5)\n\t\t.optional(), // Limit to 5 sort fields\n\tsort: z.record(z.string(), z.literal(1).or(z.literal(-1))).optional(),\n});\n\nexport type TDataKitSchemaZod = z.infer<typeof dataKitSchemaZod>;\n"]}
1
+ {"version":3,"sources":["../src/server/utils.ts","../src/server/adapters/mongoose.ts","../src/server/action.ts","../src/server/adapters/memory.ts","../src/server/schema.ts"],"names":["z"],"mappings":"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","file":"server.cjs","sourcesContent":["/**\n * next-data-kit - Server Utilities\n */\n\nimport type { TMongoFilterQuery, TSortEntry, TPaginationInfo } from '../types';\n\n/**\n * Check if a value is provided (not undefined, null, or empty string)\n */\nexport const isProvided = (value: unknown): boolean => value !== undefined && value !== null && value !== '';\n\n/**\n * Get a nested value from an object by path (e.g., 'user.name')\n */\nexport const getValueByPath = (obj: unknown, path: string): unknown => {\n\tif (!path) return undefined;\n\tconst parts = path.split('.');\n\tlet current: unknown = obj;\n\tfor (const part of parts) {\n\t\tif (current && typeof current === 'object' && part in (current as Record<string, unknown>)) {\n\t\t\tcurrent = (current as Record<string, unknown>)[part];\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\treturn current;\n};\n\n/**\n * Check if a value matches exactly (supports array inclusion)\n */\nexport const matchesExact = (rowValue: unknown, needle: unknown): boolean => {\n\tif (Array.isArray(needle)) return needle.includes(rowValue as never);\n\treturn rowValue === needle;\n};\n\n/**\n * Check if a value matches a regex-like pattern (case-insensitive)\n */\nexport const matchesRegexLike = (rowValue: unknown, needle: unknown): boolean => {\n\tif (!isProvided(needle)) return true;\n\tif (rowValue === undefined || rowValue === null) return false;\n\tconst hay = String(rowValue);\n\n\tif (needle instanceof RegExp) return needle.test(hay);\n\tconst n = String(needle);\n\treturn hay.toLowerCase().includes(n.toLowerCase());\n};\n\n/**\n * Compare two values for sorting\n */\nexport const compareValues = (a: unknown, b: unknown): number => {\n\tif (a === b) return 0;\n\tif (a === undefined || a === null) return -1;\n\tif (b === undefined || b === null) return 1;\n\n\tif (typeof a === 'number' && typeof b === 'number') return a - b;\n\tif (typeof a === 'bigint' && typeof b === 'bigint') return a < b ? -1 : 1;\n\n\tconst as = String(a);\n\tconst bs = String(b);\n\treturn as.localeCompare(bs);\n};\n\n/**\n * Normalize and validate sort entries\n */\nexport const normalizeSorts = (sorts: TSortEntry[] | undefined): TSortEntry[] => (Array.isArray(sorts) ? sorts.filter(s => !!s?.path && (s.value === 1 || s.value === -1)) : []);\n\n/**\n * Check if a key is safe (not a prototype pollution key)\n */\nexport const isSafeKey = (key: string): boolean => {\n\tconst unsafeKeys = ['__proto__', 'constructor', 'prototype'];\n\treturn !unsafeKeys.includes(key);\n};\n\n/**\n * Helper to escape regex special characters in a string\n */\nexport const escapeRegex = (str: string): string => {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n};\n\n/**\n * Create a search filter for multiple fields\n *\n * @example\n * ```typescript\n * filterCustom: {\n * search: createSearchFilter(['name', 'email', 'phone'])\n * }\n * ```\n */\nexport const createSearchFilter = <T>(fields: (keyof T | string)[]): ((value: unknown) => TMongoFilterQuery<T>) => {\n\treturn (value: unknown): TMongoFilterQuery<T> => {\n\t\tif (!value || typeof value !== 'string') {\n\t\t\treturn {} as TMongoFilterQuery<T>;\n\t\t}\n\n\t\tconst escapedValue = escapeRegex(value);\n\t\treturn {\n\t\t\t$or: fields.map(field => ({\n\t\t\t\t[field]: { $regex: escapedValue, $options: 'i' },\n\t\t\t})),\n\t\t} as TMongoFilterQuery<T>;\n\t};\n};\n/**\n * Calculate pagination info from page, limit, and total\n */\nexport const calculatePagination = (page: number, limit: number, total: number): TPaginationInfo => ({\n\tcurrentPage: page,\n\ttotalPages: Math.ceil(total / limit),\n\ttotalItems: total,\n\titemsPerPage: limit,\n\thasNextPage: page * limit < total,\n\thasPrevPage: page > 1,\n});\n","/**\n * next-data-kit - Mongoose Adapter\n *\n * Database adapter for Mongoose/MongoDB.\n */\n\nimport type { TMongoModel, TMongoFilterQuery, TSortOrder, TSortOptions, TFilterCustomConfigWithFilter, TDataKitAdapter } from '../../types';\nimport { escapeRegex, isProvided, isSafeKey } from '../utils';\n\nexport const mongooseAdapter = <DocType = unknown>(\n\tmodel: TMongoModel<DocType>,\n\toptions: Readonly<{\n\t\tfilter?: (filterInput?: Record<string, unknown>) => TMongoFilterQuery<DocType>;\n\t\tfilterCustom?: TFilterCustomConfigWithFilter<DocType, TMongoFilterQuery<DocType>>;\n\t\tdefaultSort?: TSortOptions<DocType>;\n\t}> = {},\n): TDataKitAdapter<DocType> => {\n\t// ** Deconstruct options\n\tconst { filter: customFilterFn, filterCustom, defaultSort = { _id: -1 } as TSortOptions<DocType> } = options;\n\n\treturn async ({ filter, sorts, limit, skip, input }) => {\n\t\t// ** Normalize sort\n\t\tlet sortOption: Record<string, TSortOrder>;\n\n\t\tif (input.sort && Object.keys(input.sort).length > 0) {\n\t\t\tsortOption = input.sort as Record<string, TSortOrder>;\n\t\t} else if (sorts && sorts.length > 0) {\n\t\t\tsortOption = sorts.reduce<Record<string, TSortOrder>>((acc, s) => {\n\t\t\t\tif (s?.path && (s.value === 1 || s.value === -1)) {\n\t\t\t\t\tacc[s.path] = s.value;\n\t\t\t\t}\n\t\t\t\treturn acc;\n\t\t\t}, {});\n\t\t} else {\n\t\t\tsortOption = defaultSort as Record<string, TSortOrder>;\n\t\t}\n\n\t\t// ** Construct filter query\n\t\tlet filterQuery: TMongoFilterQuery<DocType> = {};\n\n\t\t// ** Query params (exact match)\n\t\tif (input.query) {\n\t\t\tObject.entries(input.query).forEach(([key, value]) => {\n\t\t\t\tif (isProvided(value) && isSafeKey(key)) {\n\t\t\t\t\t(filterQuery as Record<string, unknown>)[key] = value;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// ** Custom filter function\n\t\tif (customFilterFn) {\n\t\t\tconst customQuery = customFilterFn(filter);\n\t\t\tfilterQuery = { ...filterQuery, ...customQuery };\n\t\t}\n\n\t\t// ** User defined filters\n\t\tif (filter && !customFilterFn) {\n\t\t\tif (input.filterConfig) {\n\t\t\t\tObject.entries(filter).forEach(([key, value]) => {\n\t\t\t\t\tif (isProvided(value) && isSafeKey(key) && input.filterConfig?.[key]) {\n\t\t\t\t\t\tconst config = input.filterConfig[key];\n\t\t\t\t\t\tconst fieldName = config?.field ?? key;\n\n\t\t\t\t\t\tif (config?.type === 'REGEX') {\n\t\t\t\t\t\t\t(filterQuery as Record<string, unknown>)[fieldName] = {\n\t\t\t\t\t\t\t\t$regex: escapeRegex(String(value)),\n\t\t\t\t\t\t\t\t$options: 'i',\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else if (config?.type === 'EXACT') {\n\t\t\t\t\t\t\t(filterQuery as Record<string, unknown>)[fieldName] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// ** Default automatic filtering\n\t\t\t\tObject.entries(filter).forEach(([key, value]) => {\n\t\t\t\t\tif (isProvided(value) && isSafeKey(key)) {\n\t\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\t\t(filterQuery as Record<string, unknown>)[key] = {\n\t\t\t\t\t\t\t\t$regex: escapeRegex(value),\n\t\t\t\t\t\t\t\t$options: 'i',\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else if (typeof value === 'number' || typeof value === 'boolean') {\n\t\t\t\t\t\t\t(filterQuery as Record<string, unknown>)[key] = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// ** Custom filter logic (filterCustom)\n\t\tif (filterCustom && filter) {\n\t\t\tObject.entries(filter).forEach(([key, value]) => {\n\t\t\t\tif (isProvided(value) && isSafeKey(key) && filterCustom[key]) {\n\t\t\t\t\tconst customFilter = filterCustom[key]!(value);\n\t\t\t\t\tfilterQuery = { ...filterQuery, ...customFilter };\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// ** Execute queries\n\t\tconst total = await model.countDocuments(filterQuery as TMongoFilterQuery<unknown>);\n\t\tconst items = (await model\n\t\t\t.find(filterQuery as TMongoFilterQuery<unknown>)\n\t\t\t.sort(sortOption)\n\t\t\t.limit(limit)\n\t\t\t.skip(skip)) as unknown as DocType[];\n\n\t\treturn { items, total };\n\t};\n};\n","/**\n * next-data-kit - Server Action\n *\n * The main server-side function for handling table data fetching\n * with pagination, filtering, and sorting.\n */\n\nimport { mongooseAdapter } from './adapters/mongoose';\nimport type { Model } from 'mongoose';\nimport type { TDataKitInput, TDataKitResult, TDataKitAdapter, TMongoModel, TExtractDocType, TMongooseOptions, TAdapterOptions } from '../types';\n\n/**\n * Core execution logic shared by both overloads\n */\nasync function executeDataKit<TDoc, R>(input: TDataKitInput<TDoc>, adapter: TDataKitAdapter<TDoc>, item: (item: TDoc) => Promise<R> | R, maxLimit: number, filterAllowed?: string[], queryAllowed?: (keyof TDoc | string)[]): Promise<TDataKitResult<R>> {\n\t// Check Query\n\tif (input.query) {\n\t\tconst safeQuery: Record<string, string | number | boolean> = {};\n\t\tObject.keys(input.query).forEach(key => {\n\t\t\tif (queryAllowed && !queryAllowed.includes(key)) {\n\t\t\t\tthrow new Error(`[Security] Query field '${key}' is not allowed.`);\n\t\t\t}\n\t\t\tconst val = input.query![key];\n\t\t\tif (val !== null && typeof val === 'object') {\n\t\t\t\tthrow new Error(`[Security] Query value for '${key}' must be a primitive.`);\n\t\t\t}\n\t\t\tif (val !== undefined) {\n\t\t\t\tsafeQuery[key] = val;\n\t\t\t}\n\t\t});\n\t\tinput.query = safeQuery;\n\t}\n\n\t// Check Filter\n\tif (input.filter) {\n\t\tconst safeFilter: Record<string, unknown> = {};\n\t\tObject.keys(input.filter).forEach(key => {\n\t\t\tif (filterAllowed && !filterAllowed.includes(key)) {\n\t\t\t\tthrow new Error(`[Security] Filter field '${key}' is not allowed.`);\n\t\t\t}\n\t\t\tconst val = input.filter![key];\n\t\t\tif (val !== null && typeof val === 'object') {\n\t\t\t\tthrow new Error(`[Security] Filter value for '${key}' must be a primitive.`);\n\t\t\t}\n\t\t\tsafeFilter[key] = val;\n\t\t});\n\t\tinput.filter = safeFilter;\n\t}\n\n\t// Handle action\n\tswitch (input.action ?? 'FETCH') {\n\t\tcase 'FETCH': {\n\t\t\tif (!input.limit || !input.page) {\n\t\t\t\tthrow new Error('Invalid input: missing limit or page');\n\t\t\t}\n\n\t\t\tconst limit = Math.min(input.limit, maxLimit);\n\t\t\tconst skip = limit * (input.page - 1);\n\n\t\t\tconst { items, total } = await adapter({\n\t\t\t\tfilter: input.filter ?? {},\n\t\t\t\tsorts: input.sorts ?? [],\n\t\t\t\tlimit,\n\t\t\t\tpage: input.page,\n\t\t\t\tskip,\n\t\t\t\tinput,\n\t\t\t});\n\n\t\t\tconst processedItems = await Promise.all(items.map(dataItem => item(dataItem)));\n\n\t\t\treturn {\n\t\t\t\ttype: 'ITEMS',\n\t\t\t\titems: processedItems,\n\t\t\t\tdocumentTotal: total,\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported action: ${(input as { action?: string }).action}`);\n\t}\n}\n\n/**\n * Server action with Mongoose model (auto-infers document type)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function dataKitServerAction<M extends Model<any>, R = unknown>(props: Readonly<TMongooseOptions<M, TExtractDocType<M>, R>>): Promise<TDataKitResult<R>>;\n\n/**\n * Server action with custom adapter\n */\nexport async function dataKitServerAction<TDoc, R = unknown>(props: Readonly<TAdapterOptions<TDoc, R>>): Promise<TDataKitResult<R>>;\n\n/**\n * Implementation\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function dataKitServerAction<M extends Model<any>, TDoc = any, R = unknown>(props: Readonly<TMongooseOptions<M, TDoc, R> | TAdapterOptions<TDoc, R>>): Promise<TDataKitResult<R>> {\n\tconst { input, item, maxLimit = 100, queryAllowed, filterAllowed: explicitFilterAllowed } = props;\n\n\t// Determine filterAllowed\n\tconst filterCustom = 'filterCustom' in props ? props.filterCustom : undefined;\n\tconst filterAllowed = explicitFilterAllowed ?? (filterCustom ? Object.keys(filterCustom) : undefined);\n\n\t// Determine adapter\n\tlet finalAdapter: TDataKitAdapter<TDoc>;\n\n\tif ('adapter' in props && props.adapter) {\n\t\tfinalAdapter = props.adapter;\n\t} else if ('model' in props && props.model) {\n\t\tconst model = props.model as unknown as TMongoModel<TDoc>;\n\t\tfinalAdapter = mongooseAdapter(model, {\n\t\t\tfilter: props.filter,\n\t\t\tfilterCustom: props.filterCustom,\n\t\t\tdefaultSort: props.defaultSort,\n\t\t}) as TDataKitAdapter<TDoc>;\n\t} else {\n\t\tthrow new Error('Either model or adapter must be provided');\n\t}\n\n\treturn executeDataKit(input, finalAdapter, item, maxLimit, filterAllowed, queryAllowed);\n}\n","/**\n * next-data-kit - Memory Adapter\n *\n * In-memory adapter for demos, tests, and local playgrounds.\n * Implements the React Data Kit adapter contract over an array dataset.\n */\n\nimport type { TFilterConfig, TDataKitAdapter } from '../../types';\nimport { isProvided, getValueByPath, matchesExact, matchesRegexLike, compareValues, normalizeSorts } from '../utils';\n\n/**\n * Creates an adapter that pages/filters/sorts an in-memory dataset.\n */\nexport const adapterMemory = <T extends Record<string, unknown>>(\n\tdataset: ReadonlyArray<T>,\n\toptions: Readonly<{\n\t\t/** default behavior for filter keys not present in filterConfig */\n\t\tdefaultFilterType?: 'regex' | 'exact';\n\t}> = {},\n): TDataKitAdapter<T> => {\n\tconst { defaultFilterType = 'exact' } = options;\n\n\treturn async ({ filter, sorts, limit, skip, input }) => {\n\t\tconst filterConfig: TFilterConfig | undefined = input.filterConfig;\n\t\tconst query = input.query ?? {};\n\n\t\t// 1) Apply query (exact match)\n\t\tlet rows = dataset.filter(row => {\n\t\t\tfor (const [key, value] of Object.entries(query)) {\n\t\t\t\tif (!isProvided(value)) continue;\n\t\t\t\tconst rowValue = getValueByPath(row, key);\n\t\t\t\tif (!matchesExact(rowValue, value)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\t// 2) Apply filter (via filterConfig when present)\n\t\tconst effectiveFilter = filter ?? {};\n\t\trows = rows.filter(row => {\n\t\t\tfor (const [key, value] of Object.entries(effectiveFilter)) {\n\t\t\t\tif (!isProvided(value)) continue;\n\n\t\t\t\tconst config = filterConfig?.[key];\n\t\t\t\tconst field = config?.field ?? key;\n\t\t\t\tconst rowValue = getValueByPath(row, field);\n\n\t\t\t\tconst type = config?.type ?? defaultFilterType;\n\t\t\t\tif (type === 'regex') {\n\t\t\t\t\tif (!matchesRegexLike(rowValue, value)) return false;\n\t\t\t\t} else {\n\t\t\t\t\tif (!matchesExact(rowValue, value)) return false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\n\t\t// 3) Sort\n\t\tconst normalizedSorts = normalizeSorts(sorts);\n\t\tif (normalizedSorts.length > 0) {\n\t\t\trows = [...rows].sort((ra, rb) => {\n\t\t\t\tfor (const s of normalizedSorts) {\n\t\t\t\t\tconst av = getValueByPath(ra, s.path);\n\t\t\t\t\tconst bv = getValueByPath(rb, s.path);\n\t\t\t\t\tconst cmp = compareValues(av, bv);\n\t\t\t\t\tif (cmp !== 0) return s.value === 1 ? cmp : -cmp;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t});\n\t\t}\n\n\t\tconst total = rows.length;\n\t\tconst items = rows.slice(skip, skip + limit);\n\t\treturn { items, total };\n\t};\n};\n","import { z } from 'zod';\n\nexport const dataKitSchemaZod = z.object({\n\tpage: z.number().int().positive().optional(),\n\tlimit: z.number().int().positive().optional(),\n\tquery: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),\n\tfilter: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])).optional(),\n\tfilterConfig: z\n\t\t.record(\n\t\t\tz.string(),\n\t\t\tz.object({\n\t\t\t\ttype: z.enum(['REGEX', 'EXACT']),\n\t\t\t\tfield: z.string().optional(),\n\t\t\t}),\n\t\t)\n\t\t.optional(),\n\tsorts: z\n\t\t.array(\n\t\t\tz.object({\n\t\t\t\tpath: z.string().max(100), // Limit path length to prevent abuse\n\t\t\t\tvalue: z.literal(-1).or(z.literal(1)),\n\t\t\t}),\n\t\t)\n\t\t.max(5)\n\t\t.optional(), // Limit to 5 sort fields\n\tsort: z.record(z.string(), z.literal(1).or(z.literal(-1))).optional(),\n});\n\nexport type TDataKitSchemaZod = z.infer<typeof dataKitSchemaZod>;\n"]}
package/dist/server.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Model } from 'mongoose';
2
- import { T as TDataKitInput, a as TMongoFilterQuery, b as TFilterCustomConfigWithFilter, c as TSortOptions, d as TDataKitResult, e as TDataKitAdapter, f as TMongoModel } from './next-data-kit-DgLsBFv3.cjs';
3
- export { i as TFilterConfig, h as TFilterCustomConfig, g as TSortOrder } from './next-data-kit-DgLsBFv3.cjs';
2
+ import { T as TMongooseOptions, a as TExtractDocType, b as TDataKitResult, c as TAdapterOptions, d as TMongoModel, e as TMongoFilterQuery, f as TFilterCustomConfigWithFilter, g as TSortOptions, h as TDataKitAdapter, i as TPaginationInfo } from './action-DwiE6Cov.cjs';
3
+ export { k as TDataKitInput, m as TFilterConfig, l as TFilterCustomConfig, j as TSortOrder } from './action-DwiE6Cov.cjs';
4
4
  import { z } from 'zod';
5
5
 
6
6
  /**
@@ -10,40 +10,6 @@ import { z } from 'zod';
10
10
  * with pagination, filtering, and sorting.
11
11
  */
12
12
 
13
- /**
14
- * Extract document type from a Mongoose Model.
15
- */
16
- type TExtractDocType<M> = M extends Model<infer TRawDocType, any, any, any, any, any> ? TRawDocType : never;
17
- /**
18
- * Base options shared by both mongoose and adapter versions
19
- */
20
- type TBaseOptions<TDoc, R> = {
21
- input: TDataKitInput<TDoc>;
22
- item: (item: TDoc) => Promise<R> | R;
23
- filterAllowed?: string[];
24
- maxLimit?: number;
25
- queryAllowed?: (keyof TDoc | string)[];
26
- };
27
- /**
28
- * Options when using a Mongoose model
29
- */
30
- type TMongooseOptions<M, TDoc, R> = TBaseOptions<TDoc, R> & {
31
- model: M;
32
- adapter?: never;
33
- filter?: (filterInput?: Record<string, unknown>) => TMongoFilterQuery<TDoc>;
34
- filterCustom?: TFilterCustomConfigWithFilter<TDoc, TMongoFilterQuery<TDoc>>;
35
- defaultSort?: TSortOptions<TDoc>;
36
- };
37
- /**
38
- * Options when using a custom adapter
39
- */
40
- type TAdapterOptions<TDoc, R> = TBaseOptions<TDoc, R> & {
41
- adapter: TDataKitAdapter<TDoc>;
42
- model?: never;
43
- filter?: never;
44
- filterCustom?: TFilterCustomConfigWithFilter<TDoc, unknown>;
45
- defaultSort?: never;
46
- };
47
13
  /**
48
14
  * Server action with Mongoose model (auto-infers document type)
49
15
  */
@@ -63,7 +29,6 @@ declare const mongooseAdapter: <DocType = unknown>(model: TMongoModel<DocType>,
63
29
  filter?: (filterInput?: Record<string, unknown>) => TMongoFilterQuery<DocType>;
64
30
  filterCustom?: TFilterCustomConfigWithFilter<DocType, TMongoFilterQuery<DocType>>;
65
31
  defaultSort?: TSortOptions<DocType>;
66
- [key: string]: any;
67
32
  }>) => TDataKitAdapter<DocType>;
68
33
 
69
34
  /**
@@ -108,6 +73,10 @@ declare const escapeRegex: (str: string) => string;
108
73
  * ```
109
74
  */
110
75
  declare const createSearchFilter: <T>(fields: (keyof T | string)[]) => ((value: unknown) => TMongoFilterQuery<T>);
76
+ /**
77
+ * Calculate pagination info from page, limit, and total
78
+ */
79
+ declare const calculatePagination: (page: number, limit: number, total: number) => TPaginationInfo;
111
80
 
112
81
  declare const dataKitSchemaZod: z.ZodObject<{
113
82
  page: z.ZodOptional<z.ZodNumber>;
@@ -166,4 +135,4 @@ declare const dataKitSchemaZod: z.ZodObject<{
166
135
  }>;
167
136
  type TDataKitSchemaZod = z.infer<typeof dataKitSchemaZod>;
168
137
 
169
- export { TDataKitAdapter, TDataKitInput, TDataKitResult, type TDataKitSchemaZod, type TExtractDocType, TFilterCustomConfigWithFilter, TMongoFilterQuery, TMongoModel, TSortOptions, adapterMemory, createSearchFilter, dataKitSchemaZod, dataKitServerAction, escapeRegex, isProvided, isSafeKey, mongooseAdapter };
138
+ export { TDataKitAdapter, TDataKitResult, type TDataKitSchemaZod, TExtractDocType, TFilterCustomConfigWithFilter, TMongoFilterQuery, TMongoModel, TSortOptions, adapterMemory, calculatePagination, createSearchFilter, dataKitSchemaZod, dataKitServerAction, escapeRegex, isProvided, isSafeKey, mongooseAdapter };
package/dist/server.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Model } from 'mongoose';
2
- import { T as TDataKitInput, a as TMongoFilterQuery, b as TFilterCustomConfigWithFilter, c as TSortOptions, d as TDataKitResult, e as TDataKitAdapter, f as TMongoModel } from './next-data-kit-DgLsBFv3.js';
3
- export { i as TFilterConfig, h as TFilterCustomConfig, g as TSortOrder } from './next-data-kit-DgLsBFv3.js';
2
+ import { T as TMongooseOptions, a as TExtractDocType, b as TDataKitResult, c as TAdapterOptions, d as TMongoModel, e as TMongoFilterQuery, f as TFilterCustomConfigWithFilter, g as TSortOptions, h as TDataKitAdapter, i as TPaginationInfo } from './action-DwiE6Cov.js';
3
+ export { k as TDataKitInput, m as TFilterConfig, l as TFilterCustomConfig, j as TSortOrder } from './action-DwiE6Cov.js';
4
4
  import { z } from 'zod';
5
5
 
6
6
  /**
@@ -10,40 +10,6 @@ import { z } from 'zod';
10
10
  * with pagination, filtering, and sorting.
11
11
  */
12
12
 
13
- /**
14
- * Extract document type from a Mongoose Model.
15
- */
16
- type TExtractDocType<M> = M extends Model<infer TRawDocType, any, any, any, any, any> ? TRawDocType : never;
17
- /**
18
- * Base options shared by both mongoose and adapter versions
19
- */
20
- type TBaseOptions<TDoc, R> = {
21
- input: TDataKitInput<TDoc>;
22
- item: (item: TDoc) => Promise<R> | R;
23
- filterAllowed?: string[];
24
- maxLimit?: number;
25
- queryAllowed?: (keyof TDoc | string)[];
26
- };
27
- /**
28
- * Options when using a Mongoose model
29
- */
30
- type TMongooseOptions<M, TDoc, R> = TBaseOptions<TDoc, R> & {
31
- model: M;
32
- adapter?: never;
33
- filter?: (filterInput?: Record<string, unknown>) => TMongoFilterQuery<TDoc>;
34
- filterCustom?: TFilterCustomConfigWithFilter<TDoc, TMongoFilterQuery<TDoc>>;
35
- defaultSort?: TSortOptions<TDoc>;
36
- };
37
- /**
38
- * Options when using a custom adapter
39
- */
40
- type TAdapterOptions<TDoc, R> = TBaseOptions<TDoc, R> & {
41
- adapter: TDataKitAdapter<TDoc>;
42
- model?: never;
43
- filter?: never;
44
- filterCustom?: TFilterCustomConfigWithFilter<TDoc, unknown>;
45
- defaultSort?: never;
46
- };
47
13
  /**
48
14
  * Server action with Mongoose model (auto-infers document type)
49
15
  */
@@ -63,7 +29,6 @@ declare const mongooseAdapter: <DocType = unknown>(model: TMongoModel<DocType>,
63
29
  filter?: (filterInput?: Record<string, unknown>) => TMongoFilterQuery<DocType>;
64
30
  filterCustom?: TFilterCustomConfigWithFilter<DocType, TMongoFilterQuery<DocType>>;
65
31
  defaultSort?: TSortOptions<DocType>;
66
- [key: string]: any;
67
32
  }>) => TDataKitAdapter<DocType>;
68
33
 
69
34
  /**
@@ -108,6 +73,10 @@ declare const escapeRegex: (str: string) => string;
108
73
  * ```
109
74
  */
110
75
  declare const createSearchFilter: <T>(fields: (keyof T | string)[]) => ((value: unknown) => TMongoFilterQuery<T>);
76
+ /**
77
+ * Calculate pagination info from page, limit, and total
78
+ */
79
+ declare const calculatePagination: (page: number, limit: number, total: number) => TPaginationInfo;
111
80
 
112
81
  declare const dataKitSchemaZod: z.ZodObject<{
113
82
  page: z.ZodOptional<z.ZodNumber>;
@@ -166,4 +135,4 @@ declare const dataKitSchemaZod: z.ZodObject<{
166
135
  }>;
167
136
  type TDataKitSchemaZod = z.infer<typeof dataKitSchemaZod>;
168
137
 
169
- export { TDataKitAdapter, TDataKitInput, TDataKitResult, type TDataKitSchemaZod, type TExtractDocType, TFilterCustomConfigWithFilter, TMongoFilterQuery, TMongoModel, TSortOptions, adapterMemory, createSearchFilter, dataKitSchemaZod, dataKitServerAction, escapeRegex, isProvided, isSafeKey, mongooseAdapter };
138
+ export { TDataKitAdapter, TDataKitResult, type TDataKitSchemaZod, TExtractDocType, TFilterCustomConfigWithFilter, TMongoFilterQuery, TMongoModel, TSortOptions, adapterMemory, calculatePagination, createSearchFilter, dataKitSchemaZod, dataKitServerAction, escapeRegex, isProvided, isSafeKey, mongooseAdapter };