convex-helpers 0.1.70 → 0.1.71
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 +8 -1
- package/package.json +1 -1
- package/validators.d.ts +3 -2
- package/validators.d.ts.map +1 -1
- package/validators.js +16 -7
- package/validators.ts +24 -9
package/README.md
CHANGED
|
@@ -671,9 +671,16 @@ const balanceAndEmail = pick(vv.doc("accounts").fields, ["balance", "email"]);
|
|
|
671
671
|
const accountWithoutBalance = omit(vv.doc("accounts").fields, ["balance"]);
|
|
672
672
|
|
|
673
673
|
// Validate against a validator. Can optionally throw on error.
|
|
674
|
-
|
|
674
|
+
const value = { balance: 123n, email: "test@example.com" };
|
|
675
|
+
validate(balanceAndEmail, value);
|
|
676
|
+
|
|
677
|
+
// This will throw a ValidationError if the value is not valid.
|
|
678
|
+
validate(balanceAndEmail, value, { throw: true });
|
|
679
|
+
|
|
675
680
|
// Warning: this only validates that `accountId` is a string.
|
|
676
681
|
validate(vv.id("accounts"), accountId);
|
|
682
|
+
// Whereas this validates that `accountId` is an id for the accounts table.
|
|
683
|
+
validate(vv.id("accounts"), accountId, { db: ctx.db });
|
|
677
684
|
```
|
|
678
685
|
|
|
679
686
|
## Filter
|
package/package.json
CHANGED
package/validators.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { GenericValidator, ObjectType, PropertyValidators, VObject, VOptional, VString, VUnion, Validator } from "convex/values";
|
|
2
2
|
import { Expand } from "./index.js";
|
|
3
|
-
import { DataModelFromSchemaDefinition, SchemaDefinition, TableNamesInDataModel } from "convex/server";
|
|
3
|
+
import { DataModelFromSchemaDefinition, GenericDatabaseReader, GenericDataModel, SchemaDefinition, TableNamesInDataModel } from "convex/server";
|
|
4
4
|
/**
|
|
5
5
|
* Helper for defining a union of literals more concisely.
|
|
6
6
|
*
|
|
@@ -234,6 +234,7 @@ export declare class ValidationError extends Error {
|
|
|
234
234
|
*/
|
|
235
235
|
export declare function validate<T extends Validator<any, any, any>>(validator: T, value: unknown, opts?: {
|
|
236
236
|
throw?: boolean;
|
|
237
|
-
|
|
237
|
+
db?: GenericDatabaseReader<GenericDataModel>;
|
|
238
|
+
_pathPrefix?: string;
|
|
238
239
|
}): value is T["type"];
|
|
239
240
|
//# sourceMappingURL=validators.d.ts.map
|
package/validators.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["validators.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,OAAO,EACP,SAAS,EACT,OAAO,EACP,MAAM,EACN,SAAS,EAEV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,eAAe,CAAC;AAEvB;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,QAAQ,GACnB,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAC5C,CAAC,SAAS,CAAC,EAAE,WAEJ,CAAC,KACT,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,CAMvB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,iNAClD,CAAC;AAEvB;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,kBAAkB,OAAO,CAAC,KAMrD,GACF,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAElC,CAAC;AAIF,wBAAwB;AACxB,eAAO,MAAM,MAAM,6BAAa,CAAC;AACjC,mEAAmE;AACnE,eAAO,MAAM,MAAM,sDAAc,CAAC;AAClC,mEAAmE;AACnE,eAAO,MAAM,OAAO,sDAAc,CAAC;AACnC,+DAA+D;AAC/D,eAAO,MAAM,OAAO,uDAAc,CAAC;AACnC,yDAAyD;AACzD,eAAO,MAAM,MAAM,oDAAY,CAAC;AAChC,yDAAyD;AACzD,eAAO,MAAM,KAAK,oDAAY,CAAC;AAC/B,uBAAuB;AACvB,eAAO,MAAM,GAAG,uDAAU,CAAC;AAC3B,sEAAsE;AACtE,eAAO,MAAM,KAAK,iDAAW,CAAC;AAC9B,uDAAuD;AACvD,eAAO,MAAQ,EAAE,6IAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["validators.ts"],"names":[],"mappings":"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"}
|
package/validators.js
CHANGED
|
@@ -308,6 +308,12 @@ export function validate(validator, value, opts) {
|
|
|
308
308
|
if (typeof value !== "string") {
|
|
309
309
|
valid = false;
|
|
310
310
|
}
|
|
311
|
+
else if (opts?.db) {
|
|
312
|
+
const id = opts.db.normalizeId(validator.tableName, value);
|
|
313
|
+
if (!id) {
|
|
314
|
+
valid = false;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
311
317
|
break;
|
|
312
318
|
}
|
|
313
319
|
case "array": {
|
|
@@ -316,8 +322,11 @@ export function validate(validator, value, opts) {
|
|
|
316
322
|
break;
|
|
317
323
|
}
|
|
318
324
|
for (const [index, v] of value.entries()) {
|
|
319
|
-
const path = `${opts?.
|
|
320
|
-
valid = validate(validator.element, v, {
|
|
325
|
+
const path = `${opts?._pathPrefix ?? ""}[${index}]`;
|
|
326
|
+
valid = validate(validator.element, v, {
|
|
327
|
+
...opts,
|
|
328
|
+
_pathPrefix: path,
|
|
329
|
+
});
|
|
321
330
|
if (!valid) {
|
|
322
331
|
expected = validator.element.kind;
|
|
323
332
|
break;
|
|
@@ -345,7 +354,7 @@ export function validate(validator, value, opts) {
|
|
|
345
354
|
for (const [k, fieldValidator] of Object.entries(validator.fields)) {
|
|
346
355
|
valid = validate(fieldValidator, value[k], {
|
|
347
356
|
...opts,
|
|
348
|
-
|
|
357
|
+
_pathPrefix: appendPath(opts, k),
|
|
349
358
|
});
|
|
350
359
|
if (!valid) {
|
|
351
360
|
break;
|
|
@@ -380,7 +389,7 @@ export function validate(validator, value, opts) {
|
|
|
380
389
|
for (const [k, fieldValue] of Object.entries(value)) {
|
|
381
390
|
valid = validate(validator.key, k, {
|
|
382
391
|
...opts,
|
|
383
|
-
|
|
392
|
+
_pathPrefix: appendPath(opts, k),
|
|
384
393
|
});
|
|
385
394
|
if (!valid) {
|
|
386
395
|
expected = validator.key.kind;
|
|
@@ -388,7 +397,7 @@ export function validate(validator, value, opts) {
|
|
|
388
397
|
}
|
|
389
398
|
valid = validate(validator.value, fieldValue, {
|
|
390
399
|
...opts,
|
|
391
|
-
|
|
400
|
+
_pathPrefix: appendPath(opts, k),
|
|
392
401
|
});
|
|
393
402
|
if (!valid) {
|
|
394
403
|
expected = validator.value.kind;
|
|
@@ -400,10 +409,10 @@ export function validate(validator, value, opts) {
|
|
|
400
409
|
}
|
|
401
410
|
}
|
|
402
411
|
if (!valid && opts?.throw) {
|
|
403
|
-
throw new ValidationError(expected, typeof value, opts?.
|
|
412
|
+
throw new ValidationError(expected, typeof value, opts?._pathPrefix);
|
|
404
413
|
}
|
|
405
414
|
return valid;
|
|
406
415
|
}
|
|
407
416
|
function appendPath(opts, path) {
|
|
408
|
-
return opts?.
|
|
417
|
+
return opts?._pathPrefix ? `${opts._pathPrefix}.${path}` : path;
|
|
409
418
|
}
|
package/validators.ts
CHANGED
|
@@ -12,6 +12,8 @@ import {
|
|
|
12
12
|
import { Expand } from "./index.js";
|
|
13
13
|
import {
|
|
14
14
|
DataModelFromSchemaDefinition,
|
|
15
|
+
GenericDatabaseReader,
|
|
16
|
+
GenericDataModel,
|
|
15
17
|
SchemaDefinition,
|
|
16
18
|
TableNamesInDataModel,
|
|
17
19
|
} from "convex/server";
|
|
@@ -357,8 +359,13 @@ export function validate<T extends Validator<any, any, any>>(
|
|
|
357
359
|
validator: T,
|
|
358
360
|
value: unknown,
|
|
359
361
|
opts?: {
|
|
362
|
+
/* If true, throw an error if the value is not valid. */
|
|
360
363
|
throw?: boolean;
|
|
361
|
-
|
|
364
|
+
/* If provided, v.id validation will check that the id is for the table. */
|
|
365
|
+
db?: GenericDatabaseReader<GenericDataModel>;
|
|
366
|
+
/* A prefix for the path of the value being validated, for error reporting.
|
|
367
|
+
This is used for recursive calls, do not set it manually. */
|
|
368
|
+
_pathPrefix?: string;
|
|
362
369
|
},
|
|
363
370
|
): value is T["type"] {
|
|
364
371
|
let valid = true;
|
|
@@ -419,6 +426,11 @@ export function validate<T extends Validator<any, any, any>>(
|
|
|
419
426
|
case "id": {
|
|
420
427
|
if (typeof value !== "string") {
|
|
421
428
|
valid = false;
|
|
429
|
+
} else if (opts?.db) {
|
|
430
|
+
const id = opts.db.normalizeId(validator.tableName, value);
|
|
431
|
+
if (!id) {
|
|
432
|
+
valid = false;
|
|
433
|
+
}
|
|
422
434
|
}
|
|
423
435
|
break;
|
|
424
436
|
}
|
|
@@ -428,8 +440,11 @@ export function validate<T extends Validator<any, any, any>>(
|
|
|
428
440
|
break;
|
|
429
441
|
}
|
|
430
442
|
for (const [index, v] of value.entries()) {
|
|
431
|
-
const path = `${opts?.
|
|
432
|
-
valid = validate(validator.element, v, {
|
|
443
|
+
const path = `${opts?._pathPrefix ?? ""}[${index}]`;
|
|
444
|
+
valid = validate(validator.element, v, {
|
|
445
|
+
...opts,
|
|
446
|
+
_pathPrefix: path,
|
|
447
|
+
});
|
|
433
448
|
if (!valid) {
|
|
434
449
|
expected = validator.element.kind;
|
|
435
450
|
break;
|
|
@@ -459,7 +474,7 @@ export function validate<T extends Validator<any, any, any>>(
|
|
|
459
474
|
for (const [k, fieldValidator] of Object.entries(validator.fields)) {
|
|
460
475
|
valid = validate(fieldValidator, (value as any)[k], {
|
|
461
476
|
...opts,
|
|
462
|
-
|
|
477
|
+
_pathPrefix: appendPath(opts, k),
|
|
463
478
|
});
|
|
464
479
|
if (!valid) {
|
|
465
480
|
break;
|
|
@@ -498,7 +513,7 @@ export function validate<T extends Validator<any, any, any>>(
|
|
|
498
513
|
for (const [k, fieldValue] of Object.entries(value)) {
|
|
499
514
|
valid = validate(validator.key, k, {
|
|
500
515
|
...opts,
|
|
501
|
-
|
|
516
|
+
_pathPrefix: appendPath(opts, k),
|
|
502
517
|
});
|
|
503
518
|
if (!valid) {
|
|
504
519
|
expected = validator.key.kind;
|
|
@@ -506,7 +521,7 @@ export function validate<T extends Validator<any, any, any>>(
|
|
|
506
521
|
}
|
|
507
522
|
valid = validate(validator.value, fieldValue, {
|
|
508
523
|
...opts,
|
|
509
|
-
|
|
524
|
+
_pathPrefix: appendPath(opts, k),
|
|
510
525
|
});
|
|
511
526
|
if (!valid) {
|
|
512
527
|
expected = validator.value.kind;
|
|
@@ -518,11 +533,11 @@ export function validate<T extends Validator<any, any, any>>(
|
|
|
518
533
|
}
|
|
519
534
|
}
|
|
520
535
|
if (!valid && opts?.throw) {
|
|
521
|
-
throw new ValidationError(expected, typeof value, opts?.
|
|
536
|
+
throw new ValidationError(expected, typeof value, opts?._pathPrefix);
|
|
522
537
|
}
|
|
523
538
|
return valid;
|
|
524
539
|
}
|
|
525
540
|
|
|
526
|
-
function appendPath(opts: {
|
|
527
|
-
return opts?.
|
|
541
|
+
function appendPath(opts: { _pathPrefix?: string } | undefined, path: string) {
|
|
542
|
+
return opts?._pathPrefix ? `${opts._pathPrefix}.${path}` : path;
|
|
528
543
|
}
|