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 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
- validate(balanceAndEmail, { balance: 123n, email: "test@example.com" });
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "convex-helpers",
3
- "version": "0.1.70",
3
+ "version": "0.1.71",
4
4
  "description": "A collection of useful code to complement the official convex package.",
5
5
  "type": "module",
6
6
  "bin": {
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
- pathPrefix?: string;
237
+ db?: GenericDatabaseReader<GenericDataModel>;
238
+ _pathPrefix?: string;
238
239
  }): value is T["type"];
239
240
  //# sourceMappingURL=validators.d.ts.map
@@ -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,0NASL,CAAC,+WAOJ,eACd,0CAjBwB,KAAK,iIAAE,KAAK,iEAAE,OAAO,iHAAE,QAAQ,gEAAE,KAAK,6EA2C/D,WAAQ,2BAGV,WAAU,eA9C6D,CAAC;AACxE,6BAA6B;AAC7B,eAAO,MAAM,WAAW,yDAAU,CAAC;AAEnC;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,SAAS,MAAM,aACxC,SAAS;;;CAIpB,CAAC;AAEH,MAAM,MAAM,YAAY,CAAC,SAAS,SAAS,MAAM,IAAI,UAAU,CAC7D,OAAO,YAAY,CAAC,SAAS,CAAC,CAC/B,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GAC3B,SAAS,SAAS,MAAM,EACxB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,aAE/B,SAAS,UACZ,CAAC,KAMJ,MAAM,CAAC,CAAC;;;CAAgB,CAC9B,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAC9B,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAClC,MAAM,SAAS,kBAAkB,IAEjC,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACxC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,GAC9D,SAAS,CACP,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EACtC,CAAC,CAAC,YAAY,CAAC,EACf,CAAC,CAAC,YAAY,CAAC,GACb;KACG,QAAQ,IAAI,MAAM,MAAM,GAAG,MAAM,GAC9B,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,GAC/C,QAAQ;CACb,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,GACxB,MAAM,CACT,CAAC;AAER,eAAO,MAAM,GAAG,GACd,MAAM,SAAS,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,EAC7C,SAAS,SAAS,qBAAqB,CACrC,6BAA6B,CAAC,MAAM,CAAC,CACtC,UAEO,MAAM,aACH,SAAS,KACnB,oBAAoB,CACrB,CAAC,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,EACjD,YAAY,CAAC,SAAS,CAAC,CAmBxB,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,MAAM,CAAC,MAAM,SAAS,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,EAClE,MAAM,EAAE,MAAM;IAIZ;;;;OAIG;SAED,SAAS,SAAS,qBAAqB,CACrC,6BAA6B,CAAC,MAAM,CAAC,CACtC,aAEU,SAAS;IAEtB;;;;;;;;OAQG;UAED,SAAS,SAAS,qBAAqB,CACrC,6BAA6B,CAAC,MAAM,CAAC,CACtC,aAEU,SAAS,KACnB,oBAAoB,CACrB,CAAC,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,EACjD,YAAY,CAAC,SAAS,CAAC,CACxB;;;;;;;;;;;oOA3Ie,CAAC,+WAOJ,eACd;;2DAwBC,GAAC,wBAEH,WAAQ,2BAGV,WAAU;;;EAwGT;AAED;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,MAAM,UAAU,CAAC,KACzC,OAAO,CAAC,MAAM,GAAG;IAAE,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC,CAAC;AAE3C,6EAA6E;AAC7E,eAAO,MAAM,UAAU,EAA0B,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,gBAAgB,mBAAmB,CAAC,KAAG,CAC/C,CAAC;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,CAAC,gBACzD,CAAC,KACd,CAA6C,CAAC;AAEjD,qBAAa,eAAgB,SAAQ,KAAK;IAE/B,QAAQ,EAAE,MAAM;IAChB,GAAG,EAAE,MAAM;IACX,IAAI,CAAC,EAAE,MAAM;gBAFb,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,MAAM,YAAA;CAMvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACzD,SAAS,EAAE,CAAC,EACZ,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE;IACL,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,CAiKpB"}
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?.pathPrefix ?? ""}[${index}]`;
320
- valid = validate(validator.element, v, { ...opts, pathPrefix: path });
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
- pathPrefix: appendPath(opts, k),
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
- pathPrefix: appendPath(opts, k),
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
- pathPrefix: appendPath(opts, k),
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?.pathPrefix);
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?.pathPrefix ? `${opts.pathPrefix}.${path}` : path;
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
- pathPrefix?: string;
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?.pathPrefix ?? ""}[${index}]`;
432
- valid = validate(validator.element, v, { ...opts, pathPrefix: path });
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
- pathPrefix: appendPath(opts, k),
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
- pathPrefix: appendPath(opts, k),
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
- pathPrefix: appendPath(opts, k),
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?.pathPrefix);
536
+ throw new ValidationError(expected, typeof value, opts?._pathPrefix);
522
537
  }
523
538
  return valid;
524
539
  }
525
540
 
526
- function appendPath(opts: { pathPrefix?: string } | undefined, path: string) {
527
- return opts?.pathPrefix ? `${opts.pathPrefix}.${path}` : path;
541
+ function appendPath(opts: { _pathPrefix?: string } | undefined, path: string) {
542
+ return opts?._pathPrefix ? `${opts._pathPrefix}.${path}` : path;
528
543
  }