next-data-kit 7.1.0 → 7.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -2
- package/dist/{action-C-MJOe6-.d.cts → action-De2eEXMg.d.cts} +1 -0
- package/dist/{action-C-MJOe6-.d.ts → action-De2eEXMg.d.ts} +1 -0
- package/dist/client/components/data-kit.d.ts +4 -0
- package/dist/client/components/data-kit.d.ts.map +1 -1
- package/dist/client/components/data-kit.js +2 -2
- package/dist/client/components/data-kit.js.map +1 -1
- package/dist/index.cjs +12 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/server.cjs +10 -3
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +2 -2
- package/dist/server.d.ts +2 -2
- package/dist/server.js +10 -3
- package/dist/server.js.map +1 -1
- package/dist/types/index.d.cts +2 -2
- package/dist/types/server/action.d.ts +1 -0
- package/dist/types/server/action.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -287,14 +287,28 @@ dataKitServerAction({
|
|
|
287
287
|
input: TDataKitInput,
|
|
288
288
|
item: user => ({ ... }), // user is typed from model
|
|
289
289
|
filterCustom?: { ... }, // Custom filter handlers
|
|
290
|
-
filter?: (input) => query, //
|
|
290
|
+
filter?: { ... } | (input) => query, // Base filter (object or function)
|
|
291
291
|
defaultSort?: { ... },
|
|
292
292
|
maxLimit?: number, // Default: 100
|
|
293
293
|
queryAllowed?: string[], // Whitelist for query fields
|
|
294
294
|
filterAllowed?: string[], // Auto-derived from filterCustom
|
|
295
|
+
sortAllowed?: string[], // Whitelist for sortable fields
|
|
295
296
|
});
|
|
296
297
|
```
|
|
297
298
|
|
|
299
|
+
**Filter Options:**
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
// As a plain object (static base filter)
|
|
303
|
+
filter: { isActive: true, deletedAt: null }
|
|
304
|
+
|
|
305
|
+
// As a function (dynamic filter based on input)
|
|
306
|
+
filter: (filterInput) => ({
|
|
307
|
+
organizationId: filterInput?.orgId,
|
|
308
|
+
isActive: true
|
|
309
|
+
})
|
|
310
|
+
```
|
|
311
|
+
|
|
298
312
|
**With Custom Adapter** (for testing or non-mongoose):
|
|
299
313
|
|
|
300
314
|
```typescript
|
|
@@ -307,12 +321,13 @@ dataKitServerAction({
|
|
|
307
321
|
maxLimit?: number,
|
|
308
322
|
queryAllowed?: string[],
|
|
309
323
|
filterAllowed?: string[],
|
|
324
|
+
sortAllowed?: string[],
|
|
310
325
|
});
|
|
311
326
|
```
|
|
312
327
|
|
|
313
328
|
### Security & Filtering
|
|
314
329
|
|
|
315
|
-
**
|
|
330
|
+
**Three security whitelists:**
|
|
316
331
|
|
|
317
332
|
1. **`filterCustom`** - User-facing filters (search, dropdowns, etc.)
|
|
318
333
|
- Client `filters` prop → validated against `filterCustom` keys
|
|
@@ -322,6 +337,10 @@ dataKitServerAction({
|
|
|
322
337
|
- Explicit whitelist required
|
|
323
338
|
- Use for: `{ active: true }`, user-specific queries
|
|
324
339
|
|
|
340
|
+
3. **`sortAllowed`** - Sortable fields whitelist
|
|
341
|
+
- Prevents sorting on arbitrary/sensitive fields
|
|
342
|
+
- Recommended for production security
|
|
343
|
+
|
|
325
344
|
```typescript
|
|
326
345
|
dataKitServerAction({
|
|
327
346
|
model: UserModel,
|
|
@@ -332,6 +351,7 @@ dataKitServerAction({
|
|
|
332
351
|
role: value => ({ role: value }),
|
|
333
352
|
},
|
|
334
353
|
queryAllowed: ['organizationId', 'active'],
|
|
354
|
+
sortAllowed: ['name', 'email', 'createdAt'], // Only allow sorting these fields
|
|
335
355
|
});
|
|
336
356
|
```
|
|
337
357
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-kit.d.ts","sourceRoot":"","sources":["../../../src/client/components/data-kit.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAgBxE,OAAO,KAAK,EACP,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,WAAW,EACf,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"data-kit.d.ts","sourceRoot":"","sources":["../../../src/client/components/data-kit.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAgBxE,OAAO,KAAK,EACP,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,WAAW,EACf,MAAM,aAAa,CAAC;AAoOrB,eAAO,MAAM,OAAO,EAAgD,CAC/D,OAAO,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC,EAElG,KAAK,EAAE,QAAQ,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;KAAE,EAAE,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC,OAAO,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;IACrG,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CAC5E,CAAC,KACF,KAAK,CAAC,YAAY,CAAC"}
|
|
@@ -7,7 +7,7 @@ import { usePagination } from '../hooks/usePagination';
|
|
|
7
7
|
import { Button, Popover, PopoverContent, PopoverTrigger, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Switch, } from './ui';
|
|
8
8
|
const DataKitInner = (props, ref) => {
|
|
9
9
|
// ** Deconstruct Props
|
|
10
|
-
const { action, query, filterConfig, filters = [], limit: limitConfig, className, autoFetch = true, debounce = 300, refetchInterval, state: stateMode = 'memory', manual = false, children, } = props;
|
|
10
|
+
const { action, query, filterConfig, filters = [], limit: limitConfig, defaultSort = [], className, autoFetch = true, debounce = 300, refetchInterval, state: stateMode = 'memory', manual = false, children, } = props;
|
|
11
11
|
// ** Ref
|
|
12
12
|
const containerRef = useRef(null);
|
|
13
13
|
const intervalRef = useRef(null);
|
|
@@ -26,7 +26,7 @@ const DataKitInner = (props, ref) => {
|
|
|
26
26
|
initial: {
|
|
27
27
|
limit: limitConfig?.default ?? 10,
|
|
28
28
|
query: query ?? {},
|
|
29
|
-
sorts:
|
|
29
|
+
sorts: defaultSort,
|
|
30
30
|
filter: filters.reduce((acc, f) => {
|
|
31
31
|
if (f.defaultValue !== undefined)
|
|
32
32
|
acc[f.id] = f.defaultValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-kit.js","sourceRoot":"","sources":["../../../src/client/components/data-kit.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EACF,MAAM,EACN,OAAO,EACP,cAAc,EACd,cAAc,EACd,MAAM,EACN,aAAa,EACb,UAAU,EACV,aAAa,EACb,WAAW,EACX,MAAM,GACV,MAAM,MAAM,CAAC;AAcd,MAAM,YAAY,GAAG,CAEnB,
|
|
1
|
+
{"version":3,"file":"data-kit.js","sourceRoot":"","sources":["../../../src/client/components/data-kit.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -179,7 +179,7 @@ var mongooseAdapter = (model, options = {}) => {
|
|
|
179
179
|
};
|
|
180
180
|
|
|
181
181
|
// src/server/action.ts
|
|
182
|
-
async function executeDataKit(input, adapter, item, maxLimit, filterAllowed, queryAllowed) {
|
|
182
|
+
async function executeDataKit(input, adapter, item, maxLimit, filterAllowed, queryAllowed, sortAllowed) {
|
|
183
183
|
if (input.query) {
|
|
184
184
|
const safeQuery = {};
|
|
185
185
|
Object.keys(input.query).forEach((key) => {
|
|
@@ -212,6 +212,13 @@ async function executeDataKit(input, adapter, item, maxLimit, filterAllowed, que
|
|
|
212
212
|
});
|
|
213
213
|
input.filter = safeFilter;
|
|
214
214
|
}
|
|
215
|
+
if (input.sorts && sortAllowed) {
|
|
216
|
+
input.sorts.forEach((sort) => {
|
|
217
|
+
if (!sortAllowed.includes(sort.path)) {
|
|
218
|
+
throw new Error(`[Security] Sort field '${sort.path}' is not allowed.`);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
215
222
|
switch (input.action ?? "FETCH") {
|
|
216
223
|
case "FETCH": {
|
|
217
224
|
if (!input.limit || !input.page) {
|
|
@@ -239,7 +246,7 @@ async function executeDataKit(input, adapter, item, maxLimit, filterAllowed, que
|
|
|
239
246
|
}
|
|
240
247
|
}
|
|
241
248
|
async function dataKitServerAction(props) {
|
|
242
|
-
const { input, item, maxLimit = 100, queryAllowed, filterAllowed: explicitFilterAllowed } = props;
|
|
249
|
+
const { input, item, maxLimit = 100, queryAllowed, filterAllowed: explicitFilterAllowed, sortAllowed } = props;
|
|
243
250
|
const filterCustom = "filterCustom" in props ? props.filterCustom : void 0;
|
|
244
251
|
const filterAllowed = explicitFilterAllowed ?? (filterCustom ? Object.keys(filterCustom) : void 0);
|
|
245
252
|
let finalAdapter;
|
|
@@ -255,7 +262,7 @@ async function dataKitServerAction(props) {
|
|
|
255
262
|
} else {
|
|
256
263
|
throw new Error("Either model or adapter must be provided");
|
|
257
264
|
}
|
|
258
|
-
return executeDataKit(input, finalAdapter, item, maxLimit, filterAllowed, queryAllowed);
|
|
265
|
+
return executeDataKit(input, finalAdapter, item, maxLimit, filterAllowed, queryAllowed, sortAllowed);
|
|
259
266
|
}
|
|
260
267
|
|
|
261
268
|
// src/server/adapters/memory.ts
|
|
@@ -1427,6 +1434,7 @@ var DataKitInner = (props, ref) => {
|
|
|
1427
1434
|
filterConfig,
|
|
1428
1435
|
filters = [],
|
|
1429
1436
|
limit: limitConfig,
|
|
1437
|
+
defaultSort = [],
|
|
1430
1438
|
className,
|
|
1431
1439
|
autoFetch = true,
|
|
1432
1440
|
debounce: debounce2 = 300,
|
|
@@ -1449,7 +1457,7 @@ var DataKitInner = (props, ref) => {
|
|
|
1449
1457
|
initial: {
|
|
1450
1458
|
limit: limitConfig?.default ?? 10,
|
|
1451
1459
|
query: query ?? {},
|
|
1452
|
-
sorts:
|
|
1460
|
+
sorts: defaultSort,
|
|
1453
1461
|
filter: filters.reduce((acc, f) => {
|
|
1454
1462
|
if (f.defaultValue !== void 0) acc[f.id] = f.defaultValue;
|
|
1455
1463
|
return acc;
|