@atproto/lexicon 0.6.1 → 0.7.0-next.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 (61) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/blob-refs.d.ts +4 -4
  3. package/dist/blob-refs.d.ts.map +1 -1
  4. package/dist/blob-refs.js +20 -46
  5. package/dist/blob-refs.js.map +1 -1
  6. package/dist/index.d.ts +4 -4
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +4 -20
  9. package/dist/index.js.map +1 -1
  10. package/dist/lexicons.d.ts +1 -1
  11. package/dist/lexicons.d.ts.map +1 -1
  12. package/dist/lexicons.js +40 -54
  13. package/dist/lexicons.js.map +1 -1
  14. package/dist/serialize.d.ts.map +1 -1
  15. package/dist/serialize.js +22 -32
  16. package/dist/serialize.js.map +1 -1
  17. package/dist/types.d.ts.map +1 -1
  18. package/dist/types.js +193 -204
  19. package/dist/types.js.map +1 -1
  20. package/dist/util.js +6 -10
  21. package/dist/util.js.map +1 -1
  22. package/dist/validation.d.ts +2 -2
  23. package/dist/validation.d.ts.map +1 -1
  24. package/dist/validation.js +10 -17
  25. package/dist/validation.js.map +1 -1
  26. package/dist/validators/blob.d.ts +2 -2
  27. package/dist/validators/blob.d.ts.map +1 -1
  28. package/dist/validators/blob.js +5 -8
  29. package/dist/validators/blob.js.map +1 -1
  30. package/dist/validators/complex.d.ts +2 -2
  31. package/dist/validators/complex.d.ts.map +1 -1
  32. package/dist/validators/complex.js +20 -26
  33. package/dist/validators/complex.js.map +1 -1
  34. package/dist/validators/formats.d.ts +1 -1
  35. package/dist/validators/formats.d.ts.map +1 -1
  36. package/dist/validators/formats.js +38 -51
  37. package/dist/validators/formats.js.map +1 -1
  38. package/dist/validators/primitives.d.ts +2 -2
  39. package/dist/validators/primitives.d.ts.map +1 -1
  40. package/dist/validators/primitives.js +33 -69
  41. package/dist/validators/primitives.js.map +1 -1
  42. package/dist/validators/xrpc.d.ts +2 -2
  43. package/dist/validators/xrpc.d.ts.map +1 -1
  44. package/dist/validators/xrpc.js +6 -42
  45. package/dist/validators/xrpc.js.map +1 -1
  46. package/{jest.config.js → jest.config.cjs} +8 -1
  47. package/package.json +17 -9
  48. package/src/blob-refs.ts +0 -2
  49. package/src/index.ts +4 -4
  50. package/src/lexicons.ts +4 -4
  51. package/src/serialize.ts +1 -3
  52. package/src/types.ts +1 -3
  53. package/src/validation.ts +4 -4
  54. package/src/validators/blob.ts +3 -3
  55. package/src/validators/complex.ts +5 -5
  56. package/src/validators/formats.ts +3 -4
  57. package/src/validators/primitives.ts +3 -3
  58. package/src/validators/xrpc.ts +8 -4
  59. package/tests/_scaffolds/lexicons.ts +1 -1
  60. package/tests/general.test.ts +5 -5
  61. package/tsconfig.build.tsbuildinfo +1 -1
package/dist/util.js CHANGED
@@ -1,9 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toLexUri = toLexUri;
4
- exports.requiredPropertiesRefinement = requiredPropertiesRefinement;
5
- const zod_1 = require("zod");
6
- function toLexUri(str, baseUri) {
1
+ import { z } from 'zod';
2
+ export function toLexUri(str, baseUri) {
7
3
  if (str.split('#').length > 2) {
8
4
  throw new Error('Uri can only have one hash segment');
9
5
  }
@@ -18,14 +14,14 @@ function toLexUri(str, baseUri) {
18
14
  }
19
15
  return `lex:${str}`;
20
16
  }
21
- function requiredPropertiesRefinement(object, ctx) {
17
+ export function requiredPropertiesRefinement(object, ctx) {
22
18
  // Required fields check
23
19
  if (object.required === undefined) {
24
20
  return;
25
21
  }
26
22
  if (!Array.isArray(object.required)) {
27
23
  ctx.addIssue({
28
- code: zod_1.z.ZodIssueCode.invalid_type,
24
+ code: z.ZodIssueCode.invalid_type,
29
25
  received: typeof object.required,
30
26
  expected: 'array',
31
27
  });
@@ -34,7 +30,7 @@ function requiredPropertiesRefinement(object, ctx) {
34
30
  if (object.properties === undefined) {
35
31
  if (object.required.length > 0) {
36
32
  ctx.addIssue({
37
- code: zod_1.z.ZodIssueCode.custom,
33
+ code: z.ZodIssueCode.custom,
38
34
  message: `Required fields defined but no properties defined`,
39
35
  });
40
36
  }
@@ -43,7 +39,7 @@ function requiredPropertiesRefinement(object, ctx) {
43
39
  for (const field of object.required) {
44
40
  if (object.properties[field] === undefined) {
45
41
  ctx.addIssue({
46
- code: zod_1.z.ZodIssueCode.custom,
42
+ code: z.ZodIssueCode.custom,
47
43
  message: `Required field "${field}" not defined`,
48
44
  });
49
45
  }
package/dist/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;AAEA,4BAeC;AAED,oEAsCC;AAzDD,6BAAuB;AAEvB,SAAgB,QAAQ,CAAC,GAAW,EAAE,OAAgB;IACpD,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,EAAE,CAAC,CAAA;QACjE,CAAC;QACD,OAAO,GAAG,OAAO,GAAG,GAAG,EAAE,CAAA;IAC3B,CAAC;IACD,OAAO,OAAO,GAAG,EAAE,CAAA;AACrB,CAAC;AAED,SAAgB,4BAA4B,CAK1C,MAAkB,EAAE,GAAoB;IACxC,wBAAwB;IACxB,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,OAAM;IACR,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,OAAC,CAAC,YAAY,CAAC,YAAY;YACjC,QAAQ,EAAE,OAAO,MAAM,CAAC,QAAQ;YAChC,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAA;QACF,OAAM;IACR,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,OAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,mDAAmD;aAC7D,CAAC,CAAA;QACJ,CAAC;QACD,OAAM;IACR,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3C,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,OAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,mBAAmB,KAAK,eAAe;aACjD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { z } from 'zod'\n\nexport function toLexUri(str: string, baseUri?: string): string {\n if (str.split('#').length > 2) {\n throw new Error('Uri can only have one hash segment')\n }\n\n if (str.startsWith('lex:')) {\n return str\n }\n if (str.startsWith('#')) {\n if (!baseUri) {\n throw new Error(`Unable to resolve uri without anchor: ${str}`)\n }\n return `${baseUri}${str}`\n }\n return `lex:${str}`\n}\n\nexport function requiredPropertiesRefinement<\n ObjectType extends {\n required?: string[]\n properties?: Record<string, unknown>\n },\n>(object: ObjectType, ctx: z.RefinementCtx) {\n // Required fields check\n if (object.required === undefined) {\n return\n }\n\n if (!Array.isArray(object.required)) {\n ctx.addIssue({\n code: z.ZodIssueCode.invalid_type,\n received: typeof object.required,\n expected: 'array',\n })\n return\n }\n\n if (object.properties === undefined) {\n if (object.required.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Required fields defined but no properties defined`,\n })\n }\n return\n }\n\n for (const field of object.required) {\n if (object.properties[field] === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Required field \"${field}\" not defined`,\n })\n }\n }\n}\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,OAAgB;IACpD,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,EAAE,CAAC,CAAA;QACjE,CAAC;QACD,OAAO,GAAG,OAAO,GAAG,GAAG,EAAE,CAAA;IAC3B,CAAC;IACD,OAAO,OAAO,GAAG,EAAE,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,4BAA4B,CAK1C,MAAkB,EAAE,GAAoB;IACxC,wBAAwB;IACxB,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,OAAM;IACR,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,YAAY;YACjC,QAAQ,EAAE,OAAO,MAAM,CAAC,QAAQ;YAChC,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAA;QACF,OAAM;IACR,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,mDAAmD;aAC7D,CAAC,CAAA;QACJ,CAAC;QACD,OAAM;IACR,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3C,GAAG,CAAC,QAAQ,CAAC;gBACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,mBAAmB,KAAK,eAAe;aACjD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { z } from 'zod'\n\nexport function toLexUri(str: string, baseUri?: string): string {\n if (str.split('#').length > 2) {\n throw new Error('Uri can only have one hash segment')\n }\n\n if (str.startsWith('lex:')) {\n return str\n }\n if (str.startsWith('#')) {\n if (!baseUri) {\n throw new Error(`Unable to resolve uri without anchor: ${str}`)\n }\n return `${baseUri}${str}`\n }\n return `lex:${str}`\n}\n\nexport function requiredPropertiesRefinement<\n ObjectType extends {\n required?: string[]\n properties?: Record<string, unknown>\n },\n>(object: ObjectType, ctx: z.RefinementCtx) {\n // Required fields check\n if (object.required === undefined) {\n return\n }\n\n if (!Array.isArray(object.required)) {\n ctx.addIssue({\n code: z.ZodIssueCode.invalid_type,\n received: typeof object.required,\n expected: 'array',\n })\n return\n }\n\n if (object.properties === undefined) {\n if (object.required.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Required fields defined but no properties defined`,\n })\n }\n return\n }\n\n for (const field of object.required) {\n if (object.properties[field] === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Required field \"${field}\" not defined`,\n })\n }\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { Lexicons } from './lexicons';
2
- import { LexRecord, LexXrpcProcedure, LexXrpcQuery, LexXrpcSubscription } from './types';
1
+ import { Lexicons } from './lexicons.js';
2
+ import { LexRecord, LexXrpcProcedure, LexXrpcQuery, LexXrpcSubscription } from './types.js';
3
3
  export declare function assertValidRecord(lexicons: Lexicons, def: LexRecord, value: unknown): unknown;
4
4
  export declare function assertValidXrpcParams(lexicons: Lexicons, def: LexXrpcProcedure | LexXrpcQuery | LexXrpcSubscription, value: unknown): Record<string, unknown> | undefined;
5
5
  export declare function assertValidXrpcInput(lexicons: Lexicons, def: LexXrpcProcedure, value: unknown): unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EACL,SAAS,EAGT,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAIhB,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,OAAO,WAKf;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,gBAAgB,GAAG,YAAY,GAAG,mBAAmB,EAC1D,KAAK,EAAE,OAAO,uCAOf;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,OAAO,WAMf;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,gBAAgB,GAAG,YAAY,EACpC,KAAK,EAAE,OAAO,WAMf;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,mBAAmB,EACxB,KAAK,EAAE,OAAO,WAYf"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EACL,SAAS,EAGT,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACpB,MAAM,YAAY,CAAA;AAInB,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,OAAO,WAKf;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,gBAAgB,GAAG,YAAY,GAAG,mBAAmB,EAC1D,KAAK,EAAE,OAAO,uCAOf;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,OAAO,WAMf;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,gBAAgB,GAAG,YAAY,EACpC,KAAK,EAAE,OAAO,WAMf;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,mBAAmB,EACxB,KAAK,EAAE,OAAO,WAYf"}
@@ -1,46 +1,39 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.assertValidRecord = assertValidRecord;
4
- exports.assertValidXrpcParams = assertValidXrpcParams;
5
- exports.assertValidXrpcInput = assertValidXrpcInput;
6
- exports.assertValidXrpcOutput = assertValidXrpcOutput;
7
- exports.assertValidXrpcMessage = assertValidXrpcMessage;
8
- const complex_1 = require("./validators/complex");
9
- const xrpc_1 = require("./validators/xrpc");
10
- function assertValidRecord(lexicons, def, value) {
11
- const res = (0, complex_1.object)(lexicons, 'Record', def.record, value);
1
+ import { object, validateOneOf } from './validators/complex.js';
2
+ import { params } from './validators/xrpc.js';
3
+ export function assertValidRecord(lexicons, def, value) {
4
+ const res = object(lexicons, 'Record', def.record, value);
12
5
  if (!res.success)
13
6
  throw res.error;
14
7
  return res.value;
15
8
  }
16
- function assertValidXrpcParams(lexicons, def, value) {
9
+ export function assertValidXrpcParams(lexicons, def, value) {
17
10
  if (def.parameters) {
18
- const res = (0, xrpc_1.params)(lexicons, 'Params', def.parameters, value);
11
+ const res = params(lexicons, 'Params', def.parameters, value);
19
12
  if (!res.success)
20
13
  throw res.error;
21
14
  return res.value;
22
15
  }
23
16
  }
24
- function assertValidXrpcInput(lexicons, def, value) {
17
+ export function assertValidXrpcInput(lexicons, def, value) {
25
18
  if (def.input?.schema) {
26
19
  // loop: all input schema definitions
27
20
  return assertValidOneOf(lexicons, 'Input', def.input.schema, value, true);
28
21
  }
29
22
  }
30
- function assertValidXrpcOutput(lexicons, def, value) {
23
+ export function assertValidXrpcOutput(lexicons, def, value) {
31
24
  if (def.output?.schema) {
32
25
  // loop: all output schema definitions
33
26
  return assertValidOneOf(lexicons, 'Output', def.output.schema, value, true);
34
27
  }
35
28
  }
36
- function assertValidXrpcMessage(lexicons, def, value) {
29
+ export function assertValidXrpcMessage(lexicons, def, value) {
37
30
  if (def.message?.schema) {
38
31
  // loop: all output schema definitions
39
32
  return assertValidOneOf(lexicons, 'Message', def.message.schema, value, true);
40
33
  }
41
34
  }
42
35
  function assertValidOneOf(lexicons, path, def, value, mustBeObj = false) {
43
- const res = (0, complex_1.validateOneOf)(lexicons, path, def, value, mustBeObj);
36
+ const res = validateOneOf(lexicons, path, def, value, mustBeObj);
44
37
  if (!res.success)
45
38
  throw res.error;
46
39
  return res.value;
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":";;AAYA,8CAQC;AAED,sDAUC;AAED,oDASC;AAED,sDASC;AAED,wDAeC;AA9DD,kDAA4D;AAC5D,4CAA0C;AAE1C,SAAgB,iBAAiB,CAC/B,QAAkB,EAClB,GAAc,EACd,KAAc;IAEd,MAAM,GAAG,GAAG,IAAA,gBAAM,EAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACzD,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,MAAM,GAAG,CAAC,KAAK,CAAA;IACjC,OAAO,GAAG,CAAC,KAAK,CAAA;AAClB,CAAC;AAED,SAAgB,qBAAqB,CACnC,QAAkB,EAClB,GAA0D,EAC1D,KAAc;IAEd,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAA,aAAM,EAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;QAC7D,IAAI,CAAC,GAAG,CAAC,OAAO;YAAE,MAAM,GAAG,CAAC,KAAK,CAAA;QACjC,OAAO,GAAG,CAAC,KAAK,CAAA;IAClB,CAAC;AACH,CAAC;AAED,SAAgB,oBAAoB,CAClC,QAAkB,EAClB,GAAqB,EACrB,KAAc;IAEd,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACtB,qCAAqC;QACrC,OAAO,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IAC3E,CAAC;AACH,CAAC;AAED,SAAgB,qBAAqB,CACnC,QAAkB,EAClB,GAAoC,EACpC,KAAc;IAEd,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACvB,sCAAsC;QACtC,OAAO,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IAC7E,CAAC;AACH,CAAC;AAED,SAAgB,sBAAsB,CACpC,QAAkB,EAClB,GAAwB,EACxB,KAAc;IAEd,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACxB,sCAAsC;QACtC,OAAO,gBAAgB,CACrB,QAAQ,EACR,SAAS,EACT,GAAG,CAAC,OAAO,CAAC,MAAM,EAClB,KAAK,EACL,IAAI,CACL,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CACvB,QAAkB,EAClB,IAAY,EACZ,GAAgC,EAChC,KAAc,EACd,SAAS,GAAG,KAAK;IAEjB,MAAM,GAAG,GAAG,IAAA,uBAAa,EAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;IAChE,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,MAAM,GAAG,CAAC,KAAK,CAAA;IACjC,OAAO,GAAG,CAAC,KAAK,CAAA;AAClB,CAAC","sourcesContent":["import { Lexicons } from './lexicons'\nimport {\n LexRecord,\n LexRefVariant,\n LexUserType,\n LexXrpcProcedure,\n LexXrpcQuery,\n LexXrpcSubscription,\n} from './types'\nimport { object, validateOneOf } from './validators/complex'\nimport { params } from './validators/xrpc'\n\nexport function assertValidRecord(\n lexicons: Lexicons,\n def: LexRecord,\n value: unknown,\n) {\n const res = object(lexicons, 'Record', def.record, value)\n if (!res.success) throw res.error\n return res.value\n}\n\nexport function assertValidXrpcParams(\n lexicons: Lexicons,\n def: LexXrpcProcedure | LexXrpcQuery | LexXrpcSubscription,\n value: unknown,\n) {\n if (def.parameters) {\n const res = params(lexicons, 'Params', def.parameters, value)\n if (!res.success) throw res.error\n return res.value\n }\n}\n\nexport function assertValidXrpcInput(\n lexicons: Lexicons,\n def: LexXrpcProcedure,\n value: unknown,\n) {\n if (def.input?.schema) {\n // loop: all input schema definitions\n return assertValidOneOf(lexicons, 'Input', def.input.schema, value, true)\n }\n}\n\nexport function assertValidXrpcOutput(\n lexicons: Lexicons,\n def: LexXrpcProcedure | LexXrpcQuery,\n value: unknown,\n) {\n if (def.output?.schema) {\n // loop: all output schema definitions\n return assertValidOneOf(lexicons, 'Output', def.output.schema, value, true)\n }\n}\n\nexport function assertValidXrpcMessage(\n lexicons: Lexicons,\n def: LexXrpcSubscription,\n value: unknown,\n) {\n if (def.message?.schema) {\n // loop: all output schema definitions\n return assertValidOneOf(\n lexicons,\n 'Message',\n def.message.schema,\n value,\n true,\n )\n }\n}\n\nfunction assertValidOneOf(\n lexicons: Lexicons,\n path: string,\n def: LexRefVariant | LexUserType,\n value: unknown,\n mustBeObj = false,\n) {\n const res = validateOneOf(lexicons, path, def, value, mustBeObj)\n if (!res.success) throw res.error\n return res.value\n}\n"]}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,MAAM,UAAU,iBAAiB,CAC/B,QAAkB,EAClB,GAAc,EACd,KAAc;IAEd,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACzD,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,MAAM,GAAG,CAAC,KAAK,CAAA;IACjC,OAAO,GAAG,CAAC,KAAK,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAAkB,EAClB,GAA0D,EAC1D,KAAc;IAEd,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;QAC7D,IAAI,CAAC,GAAG,CAAC,OAAO;YAAE,MAAM,GAAG,CAAC,KAAK,CAAA;QACjC,OAAO,GAAG,CAAC,KAAK,CAAA;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAkB,EAClB,GAAqB,EACrB,KAAc;IAEd,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACtB,qCAAqC;QACrC,OAAO,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAAkB,EAClB,GAAoC,EACpC,KAAc;IAEd,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACvB,sCAAsC;QACtC,OAAO,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IAC7E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,QAAkB,EAClB,GAAwB,EACxB,KAAc;IAEd,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACxB,sCAAsC;QACtC,OAAO,gBAAgB,CACrB,QAAQ,EACR,SAAS,EACT,GAAG,CAAC,OAAO,CAAC,MAAM,EAClB,KAAK,EACL,IAAI,CACL,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CACvB,QAAkB,EAClB,IAAY,EACZ,GAAgC,EAChC,KAAc,EACd,SAAS,GAAG,KAAK;IAEjB,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;IAChE,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,MAAM,GAAG,CAAC,KAAK,CAAA;IACjC,OAAO,GAAG,CAAC,KAAK,CAAA;AAClB,CAAC","sourcesContent":["import { Lexicons } from './lexicons.js'\nimport {\n LexRecord,\n LexRefVariant,\n LexUserType,\n LexXrpcProcedure,\n LexXrpcQuery,\n LexXrpcSubscription,\n} from './types.js'\nimport { object, validateOneOf } from './validators/complex.js'\nimport { params } from './validators/xrpc.js'\n\nexport function assertValidRecord(\n lexicons: Lexicons,\n def: LexRecord,\n value: unknown,\n) {\n const res = object(lexicons, 'Record', def.record, value)\n if (!res.success) throw res.error\n return res.value\n}\n\nexport function assertValidXrpcParams(\n lexicons: Lexicons,\n def: LexXrpcProcedure | LexXrpcQuery | LexXrpcSubscription,\n value: unknown,\n) {\n if (def.parameters) {\n const res = params(lexicons, 'Params', def.parameters, value)\n if (!res.success) throw res.error\n return res.value\n }\n}\n\nexport function assertValidXrpcInput(\n lexicons: Lexicons,\n def: LexXrpcProcedure,\n value: unknown,\n) {\n if (def.input?.schema) {\n // loop: all input schema definitions\n return assertValidOneOf(lexicons, 'Input', def.input.schema, value, true)\n }\n}\n\nexport function assertValidXrpcOutput(\n lexicons: Lexicons,\n def: LexXrpcProcedure | LexXrpcQuery,\n value: unknown,\n) {\n if (def.output?.schema) {\n // loop: all output schema definitions\n return assertValidOneOf(lexicons, 'Output', def.output.schema, value, true)\n }\n}\n\nexport function assertValidXrpcMessage(\n lexicons: Lexicons,\n def: LexXrpcSubscription,\n value: unknown,\n) {\n if (def.message?.schema) {\n // loop: all output schema definitions\n return assertValidOneOf(\n lexicons,\n 'Message',\n def.message.schema,\n value,\n true,\n )\n }\n}\n\nfunction assertValidOneOf(\n lexicons: Lexicons,\n path: string,\n def: LexRefVariant | LexUserType,\n value: unknown,\n mustBeObj = false,\n) {\n const res = validateOneOf(lexicons, path, def, value, mustBeObj)\n if (!res.success) throw res.error\n return res.value\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Lexicons } from '../lexicons';
2
- import { LexUserType, ValidationResult } from '../types';
1
+ import { Lexicons } from '../lexicons.js';
2
+ import { LexUserType, ValidationResult } from '../types.js';
3
3
  export declare function blob(lexicons: Lexicons, path: string, def: LexUserType, value: unknown): ValidationResult;
4
4
  //# sourceMappingURL=blob.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../../src/validators/blob.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,WAAW,EAAmB,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEzE,wBAAgB,IAAI,CAClB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CASlB"}
1
+ {"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../../src/validators/blob.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAmB,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE5E,wBAAgB,IAAI,CAClB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CASlB"}
@@ -1,14 +1,11 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.blob = blob;
4
- const blob_refs_1 = require("../blob-refs");
5
- const types_1 = require("../types");
6
- function blob(lexicons, path, def, value) {
1
+ import { BlobRef } from '../blob-refs.js';
2
+ import { ValidationError } from '../types.js';
3
+ export function blob(lexicons, path, def, value) {
7
4
  // check
8
- if (!value || !(value instanceof blob_refs_1.BlobRef)) {
5
+ if (!value || !(value instanceof BlobRef)) {
9
6
  return {
10
7
  success: false,
11
- error: new types_1.ValidationError(`${path} should be a blob ref`),
8
+ error: new ValidationError(`${path} should be a blob ref`),
12
9
  };
13
10
  }
14
11
  return { success: true, value };
@@ -1 +1 @@
1
- {"version":3,"file":"blob.js","sourceRoot":"","sources":["../../src/validators/blob.ts"],"names":[],"mappings":";;AAIA,oBAcC;AAlBD,4CAAsC;AAEtC,oCAAyE;AAEzE,SAAgB,IAAI,CAClB,QAAkB,EAClB,IAAY,EACZ,GAAgB,EAChB,KAAc;IAEd,QAAQ;IACR,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,YAAY,mBAAO,CAAC,EAAE,CAAC;QAC1C,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,uBAAuB,CAAC;SAC3D,CAAA;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC","sourcesContent":["import { BlobRef } from '../blob-refs'\nimport { Lexicons } from '../lexicons'\nimport { LexUserType, ValidationError, ValidationResult } from '../types'\n\nexport function blob(\n lexicons: Lexicons,\n path: string,\n def: LexUserType,\n value: unknown,\n): ValidationResult {\n // check\n if (!value || !(value instanceof BlobRef)) {\n return {\n success: false,\n error: new ValidationError(`${path} should be a blob ref`),\n }\n }\n return { success: true, value }\n}\n"]}
1
+ {"version":3,"file":"blob.js","sourceRoot":"","sources":["../../src/validators/blob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEzC,OAAO,EAAe,eAAe,EAAoB,MAAM,aAAa,CAAA;AAE5E,MAAM,UAAU,IAAI,CAClB,QAAkB,EAClB,IAAY,EACZ,GAAgB,EAChB,KAAc;IAEd,QAAQ;IACR,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,YAAY,OAAO,CAAC,EAAE,CAAC;QAC1C,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,eAAe,CAAC,GAAG,IAAI,uBAAuB,CAAC;SAC3D,CAAA;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC","sourcesContent":["import { BlobRef } from '../blob-refs.js'\nimport { Lexicons } from '../lexicons.js'\nimport { LexUserType, ValidationError, ValidationResult } from '../types.js'\n\nexport function blob(\n lexicons: Lexicons,\n path: string,\n def: LexUserType,\n value: unknown,\n): ValidationResult {\n // check\n if (!value || !(value instanceof BlobRef)) {\n return {\n success: false,\n error: new ValidationError(`${path} should be a blob ref`),\n }\n }\n return { success: true, value }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { Lexicons } from '../lexicons';
2
- import { LexArray, LexRefVariant, LexUserType, ValidationResult } from '../types';
1
+ import { Lexicons } from '../lexicons.js';
2
+ import { LexArray, LexRefVariant, LexUserType, ValidationResult } from '../types.js';
3
3
  export declare function validate(lexicons: Lexicons, path: string, def: LexUserType, value: unknown): ValidationResult;
4
4
  export declare function array(lexicons: Lexicons, path: string, def: LexArray, value: unknown): ValidationResult;
5
5
  export declare function object(lexicons: Lexicons, path: string, def: LexUserType, value: unknown): ValidationResult;
@@ -1 +1 @@
1
- {"version":3,"file":"complex.d.ts","sourceRoot":"","sources":["../../src/validators/complex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EACL,QAAQ,EACR,aAAa,EACb,WAAW,EAEX,gBAAgB,EAGjB,MAAM,UAAU,CAAA;AAKjB,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAWlB;AAED,wBAAgB,KAAK,CACnB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,OAAO,GACb,gBAAgB,CA6ClB;AAED,wBAAgB,MAAM,CACpB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAiElB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,aAAa,GAAG,WAAW,EAChC,KAAK,EAAE,OAAO,EACd,SAAS,UAAQ,GAChB,gBAAgB,CAkClB"}
1
+ {"version":3,"file":"complex.d.ts","sourceRoot":"","sources":["../../src/validators/complex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EACL,QAAQ,EACR,aAAa,EACb,WAAW,EAEX,gBAAgB,EAGjB,MAAM,aAAa,CAAA;AAKpB,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAWlB;AAED,wBAAgB,KAAK,CACnB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,OAAO,GACb,gBAAgB,CA6ClB;AAED,wBAAgB,MAAM,CACpB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAiElB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,aAAa,GAAG,WAAW,EAChC,KAAK,EAAE,OAAO,EACd,SAAS,UAAQ,GAChB,gBAAgB,CAkClB"}
@@ -1,31 +1,25 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validate = validate;
4
- exports.array = array;
5
- exports.object = object;
6
- exports.validateOneOf = validateOneOf;
7
- const types_1 = require("../types");
8
- const util_1 = require("../util");
9
- const blob_1 = require("./blob");
10
- const primitives_1 = require("./primitives");
11
- function validate(lexicons, path, def, value) {
1
+ import { ValidationError, isDiscriminatedObject, isObj, } from '../types.js';
2
+ import { toLexUri } from '../util.js';
3
+ import { blob } from './blob.js';
4
+ import { validate as validatePrimitive } from './primitives.js';
5
+ export function validate(lexicons, path, def, value) {
12
6
  switch (def.type) {
13
7
  case 'object':
14
8
  return object(lexicons, path, def, value);
15
9
  case 'array':
16
10
  return array(lexicons, path, def, value);
17
11
  case 'blob':
18
- return (0, blob_1.blob)(lexicons, path, def, value);
12
+ return blob(lexicons, path, def, value);
19
13
  default:
20
- return (0, primitives_1.validate)(lexicons, path, def, value);
14
+ return validatePrimitive(lexicons, path, def, value);
21
15
  }
22
16
  }
23
- function array(lexicons, path, def, value) {
17
+ export function array(lexicons, path, def, value) {
24
18
  // type
25
19
  if (!Array.isArray(value)) {
26
20
  return {
27
21
  success: false,
28
- error: new types_1.ValidationError(`${path} must be an array`),
22
+ error: new ValidationError(`${path} must be an array`),
29
23
  };
30
24
  }
31
25
  // maxLength
@@ -33,7 +27,7 @@ function array(lexicons, path, def, value) {
33
27
  if (value.length > def.maxLength) {
34
28
  return {
35
29
  success: false,
36
- error: new types_1.ValidationError(`${path} must not have more than ${def.maxLength} elements`),
30
+ error: new ValidationError(`${path} must not have more than ${def.maxLength} elements`),
37
31
  };
38
32
  }
39
33
  }
@@ -42,7 +36,7 @@ function array(lexicons, path, def, value) {
42
36
  if (value.length < def.minLength) {
43
37
  return {
44
38
  success: false,
45
- error: new types_1.ValidationError(`${path} must not have fewer than ${def.minLength} elements`),
39
+ error: new ValidationError(`${path} must not have fewer than ${def.minLength} elements`),
46
40
  };
47
41
  }
48
42
  }
@@ -58,12 +52,12 @@ function array(lexicons, path, def, value) {
58
52
  }
59
53
  return { success: true, value };
60
54
  }
61
- function object(lexicons, path, def, value) {
55
+ export function object(lexicons, path, def, value) {
62
56
  // type
63
- if (!(0, types_1.isObj)(value)) {
57
+ if (!isObj(value)) {
64
58
  return {
65
59
  success: false,
66
- error: new types_1.ValidationError(`${path} must be an object`),
60
+ error: new ValidationError(`${path} must be an object`),
67
61
  };
68
62
  }
69
63
  // properties
@@ -97,7 +91,7 @@ function object(lexicons, path, def, value) {
97
91
  if (def.required?.includes(key)) {
98
92
  return {
99
93
  success: false,
100
- error: new types_1.ValidationError(`${path} must have the property "${key}"`),
94
+ error: new ValidationError(`${path} must have the property "${key}"`),
101
95
  };
102
96
  }
103
97
  }
@@ -118,20 +112,20 @@ function object(lexicons, path, def, value) {
118
112
  }
119
113
  return { success: true, value: resultValue };
120
114
  }
121
- function validateOneOf(lexicons, path, def, value, mustBeObj = false) {
115
+ export function validateOneOf(lexicons, path, def, value, mustBeObj = false) {
122
116
  let concreteDef;
123
117
  if (def.type === 'union') {
124
- if (!(0, types_1.isDiscriminatedObject)(value)) {
118
+ if (!isDiscriminatedObject(value)) {
125
119
  return {
126
120
  success: false,
127
- error: new types_1.ValidationError(`${path} must be an object which includes the "$type" property`),
121
+ error: new ValidationError(`${path} must be an object which includes the "$type" property`),
128
122
  };
129
123
  }
130
124
  if (!refsContainType(def.refs, value.$type)) {
131
125
  if (def.closed) {
132
126
  return {
133
127
  success: false,
134
- error: new types_1.ValidationError(`${path} $type must be one of ${def.refs.join(', ')}`),
128
+ error: new ValidationError(`${path} $type must be one of ${def.refs.join(', ')}`),
135
129
  };
136
130
  }
137
131
  return { success: true, value };
@@ -153,7 +147,7 @@ function validateOneOf(lexicons, path, def, value, mustBeObj = false) {
153
147
  // to avoid bugs like #0189 this needs to handle both
154
148
  // explicit and implicit #main
155
149
  const refsContainType = (refs, type) => {
156
- const lexUri = (0, util_1.toLexUri)(type);
150
+ const lexUri = toLexUri(type);
157
151
  if (refs.includes(lexUri)) {
158
152
  return true;
159
153
  }
@@ -1 +1 @@
1
- {"version":3,"file":"complex.js","sourceRoot":"","sources":["../../src/validators/complex.ts"],"names":[],"mappings":"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","sourcesContent":["import { Lexicons } from '../lexicons'\nimport {\n LexArray,\n LexRefVariant,\n LexUserType,\n ValidationError,\n ValidationResult,\n isDiscriminatedObject,\n isObj,\n} from '../types'\nimport { toLexUri } from '../util'\nimport { blob } from './blob'\nimport { validate as validatePrimitive } from './primitives'\n\nexport function validate(\n lexicons: Lexicons,\n path: string,\n def: LexUserType,\n value: unknown,\n): ValidationResult {\n switch (def.type) {\n case 'object':\n return object(lexicons, path, def, value)\n case 'array':\n return array(lexicons, path, def, value)\n case 'blob':\n return blob(lexicons, path, def, value)\n default:\n return validatePrimitive(lexicons, path, def, value)\n }\n}\n\nexport function array(\n lexicons: Lexicons,\n path: string,\n def: LexArray,\n value: unknown,\n): ValidationResult {\n // type\n if (!Array.isArray(value)) {\n return {\n success: false,\n error: new ValidationError(`${path} must be an array`),\n }\n }\n\n // maxLength\n if (typeof def.maxLength === 'number') {\n if ((value as Array<unknown>).length > def.maxLength) {\n return {\n success: false,\n error: new ValidationError(\n `${path} must not have more than ${def.maxLength} elements`,\n ),\n }\n }\n }\n\n // minLength\n if (typeof def.minLength === 'number') {\n if ((value as Array<unknown>).length < def.minLength) {\n return {\n success: false,\n error: new ValidationError(\n `${path} must not have fewer than ${def.minLength} elements`,\n ),\n }\n }\n }\n\n // items\n const itemsDef = def.items\n for (let i = 0; i < (value as Array<unknown>).length; i++) {\n const itemValue = value[i]\n const itemPath = `${path}/${i}`\n const res = validateOneOf(lexicons, itemPath, itemsDef, itemValue)\n if (!res.success) {\n return res\n }\n }\n\n return { success: true, value }\n}\n\nexport function object(\n lexicons: Lexicons,\n path: string,\n def: LexUserType,\n value: unknown,\n): ValidationResult {\n // type\n if (!isObj(value)) {\n return {\n success: false,\n error: new ValidationError(`${path} must be an object`),\n }\n }\n\n // properties\n let resultValue = value\n if ('properties' in def && def.properties != null) {\n for (const key in def.properties) {\n const keyValue = value[key]\n if (keyValue === null && def.nullable?.includes(key)) {\n continue\n }\n const propDef = def.properties[key]\n if (keyValue === undefined && !def.required?.includes(key)) {\n // Fast path for non-required undefined props.\n if (\n propDef.type === 'integer' ||\n propDef.type === 'boolean' ||\n propDef.type === 'string'\n ) {\n if (propDef.default === undefined) {\n continue\n }\n } else {\n // Other types have no defaults.\n continue\n }\n }\n const propPath = `${path}/${key}`\n const validated = validateOneOf(lexicons, propPath, propDef, keyValue)\n const propValue = validated.success ? validated.value : keyValue\n\n // Return error for bad validation, giving required rule precedence\n if (propValue === undefined) {\n if (def.required?.includes(key)) {\n return {\n success: false,\n error: new ValidationError(\n `${path} must have the property \"${key}\"`,\n ),\n }\n }\n } else {\n if (!validated.success) {\n return validated\n }\n }\n\n // Adjust value based on e.g. applied defaults, cloning shallowly if there was a changed value\n if (propValue !== keyValue) {\n if (resultValue === value) {\n // Lazy shallow clone\n resultValue = { ...value }\n }\n resultValue[key] = propValue\n }\n }\n }\n\n return { success: true, value: resultValue }\n}\n\nexport function validateOneOf(\n lexicons: Lexicons,\n path: string,\n def: LexRefVariant | LexUserType,\n value: unknown,\n mustBeObj = false, // this is the only type constraint we need currently (used by xrpc body schema validators)\n): ValidationResult {\n let concreteDef: LexUserType\n\n if (def.type === 'union') {\n if (!isDiscriminatedObject(value)) {\n return {\n success: false,\n error: new ValidationError(\n `${path} must be an object which includes the \"$type\" property`,\n ),\n }\n }\n if (!refsContainType(def.refs, value.$type)) {\n if (def.closed) {\n return {\n success: false,\n error: new ValidationError(\n `${path} $type must be one of ${def.refs.join(', ')}`,\n ),\n }\n }\n return { success: true, value }\n } else {\n concreteDef = lexicons.getDefOrThrow(value.$type)\n }\n } else if (def.type === 'ref') {\n concreteDef = lexicons.getDefOrThrow(def.ref)\n } else {\n concreteDef = def\n }\n\n return mustBeObj\n ? object(lexicons, path, concreteDef, value)\n : validate(lexicons, path, concreteDef, value)\n}\n\n// to avoid bugs like #0189 this needs to handle both\n// explicit and implicit #main\nconst refsContainType = (refs: string[], type: string) => {\n const lexUri = toLexUri(type)\n if (refs.includes(lexUri)) {\n return true\n }\n\n if (lexUri.endsWith('#main')) {\n return refs.includes(lexUri.slice(0, -5))\n } else {\n return !lexUri.includes('#') && refs.includes(`${lexUri}#main`)\n }\n}\n"]}
1
+ {"version":3,"file":"complex.js","sourceRoot":"","sources":["../../src/validators/complex.ts"],"names":[],"mappings":"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","sourcesContent":["import { Lexicons } from '../lexicons.js'\nimport {\n LexArray,\n LexRefVariant,\n LexUserType,\n ValidationError,\n ValidationResult,\n isDiscriminatedObject,\n isObj,\n} from '../types.js'\nimport { toLexUri } from '../util.js'\nimport { blob } from './blob.js'\nimport { validate as validatePrimitive } from './primitives.js'\n\nexport function validate(\n lexicons: Lexicons,\n path: string,\n def: LexUserType,\n value: unknown,\n): ValidationResult {\n switch (def.type) {\n case 'object':\n return object(lexicons, path, def, value)\n case 'array':\n return array(lexicons, path, def, value)\n case 'blob':\n return blob(lexicons, path, def, value)\n default:\n return validatePrimitive(lexicons, path, def, value)\n }\n}\n\nexport function array(\n lexicons: Lexicons,\n path: string,\n def: LexArray,\n value: unknown,\n): ValidationResult {\n // type\n if (!Array.isArray(value)) {\n return {\n success: false,\n error: new ValidationError(`${path} must be an array`),\n }\n }\n\n // maxLength\n if (typeof def.maxLength === 'number') {\n if ((value as Array<unknown>).length > def.maxLength) {\n return {\n success: false,\n error: new ValidationError(\n `${path} must not have more than ${def.maxLength} elements`,\n ),\n }\n }\n }\n\n // minLength\n if (typeof def.minLength === 'number') {\n if ((value as Array<unknown>).length < def.minLength) {\n return {\n success: false,\n error: new ValidationError(\n `${path} must not have fewer than ${def.minLength} elements`,\n ),\n }\n }\n }\n\n // items\n const itemsDef = def.items\n for (let i = 0; i < (value as Array<unknown>).length; i++) {\n const itemValue = value[i]\n const itemPath = `${path}/${i}`\n const res = validateOneOf(lexicons, itemPath, itemsDef, itemValue)\n if (!res.success) {\n return res\n }\n }\n\n return { success: true, value }\n}\n\nexport function object(\n lexicons: Lexicons,\n path: string,\n def: LexUserType,\n value: unknown,\n): ValidationResult {\n // type\n if (!isObj(value)) {\n return {\n success: false,\n error: new ValidationError(`${path} must be an object`),\n }\n }\n\n // properties\n let resultValue = value\n if ('properties' in def && def.properties != null) {\n for (const key in def.properties) {\n const keyValue = value[key]\n if (keyValue === null && def.nullable?.includes(key)) {\n continue\n }\n const propDef = def.properties[key]\n if (keyValue === undefined && !def.required?.includes(key)) {\n // Fast path for non-required undefined props.\n if (\n propDef.type === 'integer' ||\n propDef.type === 'boolean' ||\n propDef.type === 'string'\n ) {\n if (propDef.default === undefined) {\n continue\n }\n } else {\n // Other types have no defaults.\n continue\n }\n }\n const propPath = `${path}/${key}`\n const validated = validateOneOf(lexicons, propPath, propDef, keyValue)\n const propValue = validated.success ? validated.value : keyValue\n\n // Return error for bad validation, giving required rule precedence\n if (propValue === undefined) {\n if (def.required?.includes(key)) {\n return {\n success: false,\n error: new ValidationError(\n `${path} must have the property \"${key}\"`,\n ),\n }\n }\n } else {\n if (!validated.success) {\n return validated\n }\n }\n\n // Adjust value based on e.g. applied defaults, cloning shallowly if there was a changed value\n if (propValue !== keyValue) {\n if (resultValue === value) {\n // Lazy shallow clone\n resultValue = { ...value }\n }\n resultValue[key] = propValue\n }\n }\n }\n\n return { success: true, value: resultValue }\n}\n\nexport function validateOneOf(\n lexicons: Lexicons,\n path: string,\n def: LexRefVariant | LexUserType,\n value: unknown,\n mustBeObj = false, // this is the only type constraint we need currently (used by xrpc body schema validators)\n): ValidationResult {\n let concreteDef: LexUserType\n\n if (def.type === 'union') {\n if (!isDiscriminatedObject(value)) {\n return {\n success: false,\n error: new ValidationError(\n `${path} must be an object which includes the \"$type\" property`,\n ),\n }\n }\n if (!refsContainType(def.refs, value.$type)) {\n if (def.closed) {\n return {\n success: false,\n error: new ValidationError(\n `${path} $type must be one of ${def.refs.join(', ')}`,\n ),\n }\n }\n return { success: true, value }\n } else {\n concreteDef = lexicons.getDefOrThrow(value.$type)\n }\n } else if (def.type === 'ref') {\n concreteDef = lexicons.getDefOrThrow(def.ref)\n } else {\n concreteDef = def\n }\n\n return mustBeObj\n ? object(lexicons, path, concreteDef, value)\n : validate(lexicons, path, concreteDef, value)\n}\n\n// to avoid bugs like #0189 this needs to handle both\n// explicit and implicit #main\nconst refsContainType = (refs: string[], type: string) => {\n const lexUri = toLexUri(type)\n if (refs.includes(lexUri)) {\n return true\n }\n\n if (lexUri.endsWith('#main')) {\n return refs.includes(lexUri.slice(0, -5))\n } else {\n return !lexUri.includes('#') && refs.includes(`${lexUri}#main`)\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { ValidationResult } from '../types';
1
+ import { ValidationResult } from '../types.js';
2
2
  export declare function datetime(path: string, value: string): ValidationResult;
3
3
  export declare function uri(path: string, value: string): ValidationResult;
4
4
  export declare function atUri(path: string, value: string): ValidationResult;
@@ -1 +1 @@
1
- {"version":3,"file":"formats.d.ts","sourceRoot":"","sources":["../../src/validators/formats.ts"],"names":[],"mappings":"AAcA,OAAO,EAAmB,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAE5D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CActE;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAQjE;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAWnE;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAWjE;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAWpE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAc1E;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAYlE;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAUjE;AAGD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAUtE;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CASjE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAUvE"}
1
+ {"version":3,"file":"formats.d.ts","sourceRoot":"","sources":["../../src/validators/formats.ts"],"names":[],"mappings":"AAaA,OAAO,EAAmB,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE/D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CActE;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAQjE;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAWnE;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAWjE;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAWpE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAc1E;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAYlE;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAUjE;AAGD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAUtE;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CASjE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAUvE"}
@@ -1,82 +1,69 @@
1
- "use strict";
2
- /* eslint-disable import/no-deprecated */
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.datetime = datetime;
5
- exports.uri = uri;
6
- exports.atUri = atUri;
7
- exports.did = did;
8
- exports.handle = handle;
9
- exports.atIdentifier = atIdentifier;
10
- exports.nsid = nsid;
11
- exports.cid = cid;
12
- exports.language = language;
13
- exports.tid = tid;
14
- exports.recordKey = recordKey;
15
- const iso_datestring_validator_1 = require("iso-datestring-validator");
16
- const cid_1 = require("multiformats/cid");
17
- const common_web_1 = require("@atproto/common-web");
18
- const syntax_1 = require("@atproto/syntax");
19
- const types_1 = require("../types");
20
- function datetime(path, value) {
1
+ import isoDatestringValidator from 'iso-datestring-validator';
2
+ const { isValidISODateString } = isoDatestringValidator;
3
+ import { CID } from 'multiformats/cid';
4
+ import { validateLanguage } from '@atproto/common-web';
5
+ import { ensureValidAtUri, ensureValidDid, ensureValidHandle, ensureValidRecordKey, isValidNsid, isValidTid, isValidUri, } from '@atproto/syntax';
6
+ import { ValidationError } from '../types.js';
7
+ export function datetime(path, value) {
21
8
  try {
22
- if (!(0, iso_datestring_validator_1.isValidISODateString)(value)) {
9
+ if (!isValidISODateString(value)) {
23
10
  throw new Error();
24
11
  }
25
12
  }
26
13
  catch {
27
14
  return {
28
15
  success: false,
29
- error: new types_1.ValidationError(`${path} must be an valid atproto datetime (both RFC-3339 and ISO-8601)`),
16
+ error: new ValidationError(`${path} must be an valid atproto datetime (both RFC-3339 and ISO-8601)`),
30
17
  };
31
18
  }
32
19
  return { success: true, value };
33
20
  }
34
- function uri(path, value) {
35
- if (!(0, syntax_1.isValidUri)(value)) {
21
+ export function uri(path, value) {
22
+ if (!isValidUri(value)) {
36
23
  return {
37
24
  success: false,
38
- error: new types_1.ValidationError(`${path} must be a uri`),
25
+ error: new ValidationError(`${path} must be a uri`),
39
26
  };
40
27
  }
41
28
  return { success: true, value };
42
29
  }
43
- function atUri(path, value) {
30
+ export function atUri(path, value) {
44
31
  try {
45
- (0, syntax_1.ensureValidAtUri)(value);
32
+ ensureValidAtUri(value);
46
33
  }
47
34
  catch {
48
35
  return {
49
36
  success: false,
50
- error: new types_1.ValidationError(`${path} must be a valid at-uri`),
37
+ error: new ValidationError(`${path} must be a valid at-uri`),
51
38
  };
52
39
  }
53
40
  return { success: true, value };
54
41
  }
55
- function did(path, value) {
42
+ export function did(path, value) {
56
43
  try {
57
- (0, syntax_1.ensureValidDid)(value);
44
+ ensureValidDid(value);
58
45
  }
59
46
  catch {
60
47
  return {
61
48
  success: false,
62
- error: new types_1.ValidationError(`${path} must be a valid did`),
49
+ error: new ValidationError(`${path} must be a valid did`),
63
50
  };
64
51
  }
65
52
  return { success: true, value };
66
53
  }
67
- function handle(path, value) {
54
+ export function handle(path, value) {
68
55
  try {
69
- (0, syntax_1.ensureValidHandle)(value);
56
+ ensureValidHandle(value);
70
57
  }
71
58
  catch {
72
59
  return {
73
60
  success: false,
74
- error: new types_1.ValidationError(`${path} must be a valid handle`),
61
+ error: new ValidationError(`${path} must be a valid handle`),
75
62
  };
76
63
  }
77
64
  return { success: true, value };
78
65
  }
79
- function atIdentifier(path, value) {
66
+ export function atIdentifier(path, value) {
80
67
  // We can discriminate based on the "did:" prefix
81
68
  if (value.startsWith('did:')) {
82
69
  const didResult = did(path, value);
@@ -90,11 +77,11 @@ function atIdentifier(path, value) {
90
77
  }
91
78
  return {
92
79
  success: false,
93
- error: new types_1.ValidationError(`${path} must be a valid did or a handle`),
80
+ error: new ValidationError(`${path} must be a valid did or a handle`),
94
81
  };
95
82
  }
96
- function nsid(path, value) {
97
- if ((0, syntax_1.isValidNsid)(value)) {
83
+ export function nsid(path, value) {
84
+ if (isValidNsid(value)) {
98
85
  return {
99
86
  success: true,
100
87
  value,
@@ -103,49 +90,49 @@ function nsid(path, value) {
103
90
  else {
104
91
  return {
105
92
  success: false,
106
- error: new types_1.ValidationError(`${path} must be a valid nsid`),
93
+ error: new ValidationError(`${path} must be a valid nsid`),
107
94
  };
108
95
  }
109
96
  }
110
- function cid(path, value) {
97
+ export function cid(path, value) {
111
98
  try {
112
- cid_1.CID.parse(value);
99
+ CID.parse(value);
113
100
  }
114
101
  catch {
115
102
  return {
116
103
  success: false,
117
- error: new types_1.ValidationError(`${path} must be a cid string`),
104
+ error: new ValidationError(`${path} must be a cid string`),
118
105
  };
119
106
  }
120
107
  return { success: true, value };
121
108
  }
122
109
  // The language format validates well-formed BCP 47 language tags: https://www.rfc-editor.org/info/bcp47
123
- function language(path, value) {
124
- if ((0, common_web_1.validateLanguage)(value)) {
110
+ export function language(path, value) {
111
+ if (validateLanguage(value)) {
125
112
  return { success: true, value };
126
113
  }
127
114
  return {
128
115
  success: false,
129
- error: new types_1.ValidationError(`${path} must be a well-formed BCP 47 language tag`),
116
+ error: new ValidationError(`${path} must be a well-formed BCP 47 language tag`),
130
117
  };
131
118
  }
132
- function tid(path, value) {
133
- if ((0, syntax_1.isValidTid)(value)) {
119
+ export function tid(path, value) {
120
+ if (isValidTid(value)) {
134
121
  return { success: true, value };
135
122
  }
136
123
  return {
137
124
  success: false,
138
- error: new types_1.ValidationError(`${path} must be a valid TID`),
125
+ error: new ValidationError(`${path} must be a valid TID`),
139
126
  };
140
127
  }
141
- function recordKey(path, value) {
128
+ export function recordKey(path, value) {
142
129
  try {
143
- (0, syntax_1.ensureValidRecordKey)(value);
130
+ ensureValidRecordKey(value);
144
131
  }
145
132
  catch {
146
133
  return {
147
134
  success: false,
148
- error: new types_1.ValidationError(`${path} must be a valid Record Key`),
135
+ error: new ValidationError(`${path} must be a valid Record Key`),
149
136
  };
150
137
  }
151
138
  return { success: true, value };
@@ -1 +1 @@
1
- {"version":3,"file":"formats.js","sourceRoot":"","sources":["../../src/validators/formats.ts"],"names":[],"mappings":";AAAA,yCAAyC;;AAgBzC,4BAcC;AAED,kBAQC;AAED,sBAWC;AAED,kBAWC;AAED,wBAWC;AAED,oCAcC;AAED,oBAYC;AAED,kBAUC;AAGD,4BAUC;AAED,kBASC;AAED,8BAUC;AA3JD,uEAA+D;AAC/D,0CAAsC;AACtC,oDAAsD;AACtD,4CAQwB;AACxB,oCAA4D;AAE5D,SAAgB,QAAQ,CAAC,IAAY,EAAE,KAAa;IAClD,IAAI,CAAC;QACH,IAAI,CAAC,IAAA,+CAAoB,EAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,EAAE,CAAA;QACnB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,iEAAiE,CACzE;SACF,CAAA;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,GAAG,CAAC,IAAY,EAAE,KAAa;IAC7C,IAAI,CAAC,IAAA,mBAAU,EAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,gBAAgB,CAAC;SACpD,CAAA;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,KAAK,CAAC,IAAY,EAAE,KAAa;IAC/C,IAAI,CAAC;QACH,IAAA,yBAAgB,EAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,yBAAyB,CAAC;SAC7D,CAAA;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,GAAG,CAAC,IAAY,EAAE,KAAa;IAC7C,IAAI,CAAC;QACH,IAAA,uBAAc,EAAC,KAAK,CAAC,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,sBAAsB,CAAC;SAC1D,CAAA;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,MAAM,CAAC,IAAY,EAAE,KAAa;IAChD,IAAI,CAAC;QACH,IAAA,0BAAiB,EAAC,KAAK,CAAC,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,yBAAyB,CAAC;SAC7D,CAAA;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,YAAY,CAAC,IAAY,EAAE,KAAa;IACtD,iDAAiD;IACjD,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAClC,IAAI,SAAS,CAAC,OAAO;YAAE,OAAO,SAAS,CAAA;IACzC,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACxC,IAAI,YAAY,CAAC,OAAO;YAAE,OAAO,YAAY,CAAA;IAC/C,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,kCAAkC,CAAC;KACtE,CAAA;AACH,CAAC;AAED,SAAgB,IAAI,CAAC,IAAY,EAAE,KAAa;IAC9C,IAAI,IAAA,oBAAW,EAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,KAAK;SACN,CAAA;IACH,CAAC;SAAM,CAAC;QACN,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,uBAAuB,CAAC;SAC3D,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAgB,GAAG,CAAC,IAAY,EAAE,KAAa;IAC7C,IAAI,CAAC;QACH,SAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,uBAAuB,CAAC;SAC3D,CAAA;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,wGAAwG;AACxG,SAAgB,QAAQ,CAAC,IAAY,EAAE,KAAa;IAClD,IAAI,IAAA,6BAAgB,EAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IACjC,CAAC;IACD,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,IAAI,uBAAe,CACxB,GAAG,IAAI,4CAA4C,CACpD;KACF,CAAA;AACH,CAAC;AAED,SAAgB,GAAG,CAAC,IAAY,EAAE,KAAa;IAC7C,IAAI,IAAA,mBAAU,EAAC,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;IACjC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,sBAAsB,CAAC;KAC1D,CAAA;AACH,CAAC;AAED,SAAgB,SAAS,CAAC,IAAY,EAAE,KAAa;IACnD,IAAI,CAAC;QACH,IAAA,6BAAoB,EAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,uBAAe,CAAC,GAAG,IAAI,6BAA6B,CAAC;SACjE,CAAA;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC","sourcesContent":["/* eslint-disable import/no-deprecated */\n\nimport { isValidISODateString } from 'iso-datestring-validator'\nimport { CID } from 'multiformats/cid'\nimport { validateLanguage } from '@atproto/common-web'\nimport {\n ensureValidAtUri,\n ensureValidDid,\n ensureValidHandle,\n ensureValidRecordKey,\n isValidNsid,\n isValidTid,\n isValidUri,\n} from '@atproto/syntax'\nimport { ValidationError, ValidationResult } from '../types'\n\nexport function datetime(path: string, value: string): ValidationResult {\n try {\n if (!isValidISODateString(value)) {\n throw new Error()\n }\n } catch {\n return {\n success: false,\n error: new ValidationError(\n `${path} must be an valid atproto datetime (both RFC-3339 and ISO-8601)`,\n ),\n }\n }\n return { success: true, value }\n}\n\nexport function uri(path: string, value: string): ValidationResult {\n if (!isValidUri(value)) {\n return {\n success: false,\n error: new ValidationError(`${path} must be a uri`),\n }\n }\n return { success: true, value }\n}\n\nexport function atUri(path: string, value: string): ValidationResult {\n try {\n ensureValidAtUri(value)\n } catch {\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid at-uri`),\n }\n }\n\n return { success: true, value }\n}\n\nexport function did(path: string, value: string): ValidationResult {\n try {\n ensureValidDid(value)\n } catch {\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid did`),\n }\n }\n\n return { success: true, value }\n}\n\nexport function handle(path: string, value: string): ValidationResult {\n try {\n ensureValidHandle(value)\n } catch {\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid handle`),\n }\n }\n\n return { success: true, value }\n}\n\nexport function atIdentifier(path: string, value: string): ValidationResult {\n // We can discriminate based on the \"did:\" prefix\n if (value.startsWith('did:')) {\n const didResult = did(path, value)\n if (didResult.success) return didResult\n } else {\n const handleResult = handle(path, value)\n if (handleResult.success) return handleResult\n }\n\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid did or a handle`),\n }\n}\n\nexport function nsid(path: string, value: string): ValidationResult {\n if (isValidNsid(value)) {\n return {\n success: true,\n value,\n }\n } else {\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid nsid`),\n }\n }\n}\n\nexport function cid(path: string, value: string): ValidationResult {\n try {\n CID.parse(value)\n } catch {\n return {\n success: false,\n error: new ValidationError(`${path} must be a cid string`),\n }\n }\n return { success: true, value }\n}\n\n// The language format validates well-formed BCP 47 language tags: https://www.rfc-editor.org/info/bcp47\nexport function language(path: string, value: string): ValidationResult {\n if (validateLanguage(value)) {\n return { success: true, value }\n }\n return {\n success: false,\n error: new ValidationError(\n `${path} must be a well-formed BCP 47 language tag`,\n ),\n }\n}\n\nexport function tid(path: string, value: string): ValidationResult {\n if (isValidTid(value)) {\n return { success: true, value }\n }\n\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid TID`),\n }\n}\n\nexport function recordKey(path: string, value: string): ValidationResult {\n try {\n ensureValidRecordKey(value)\n } catch {\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid Record Key`),\n }\n }\n return { success: true, value }\n}\n"]}
1
+ {"version":3,"file":"formats.js","sourceRoot":"","sources":["../../src/validators/formats.ts"],"names":[],"mappings":"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","sourcesContent":["import isoDatestringValidator from 'iso-datestring-validator'\nconst { isValidISODateString } = isoDatestringValidator\nimport { CID } from 'multiformats/cid'\nimport { validateLanguage } from '@atproto/common-web'\nimport {\n ensureValidAtUri,\n ensureValidDid,\n ensureValidHandle,\n ensureValidRecordKey,\n isValidNsid,\n isValidTid,\n isValidUri,\n} from '@atproto/syntax'\nimport { ValidationError, ValidationResult } from '../types.js'\n\nexport function datetime(path: string, value: string): ValidationResult {\n try {\n if (!isValidISODateString(value)) {\n throw new Error()\n }\n } catch {\n return {\n success: false,\n error: new ValidationError(\n `${path} must be an valid atproto datetime (both RFC-3339 and ISO-8601)`,\n ),\n }\n }\n return { success: true, value }\n}\n\nexport function uri(path: string, value: string): ValidationResult {\n if (!isValidUri(value)) {\n return {\n success: false,\n error: new ValidationError(`${path} must be a uri`),\n }\n }\n return { success: true, value }\n}\n\nexport function atUri(path: string, value: string): ValidationResult {\n try {\n ensureValidAtUri(value)\n } catch {\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid at-uri`),\n }\n }\n\n return { success: true, value }\n}\n\nexport function did(path: string, value: string): ValidationResult {\n try {\n ensureValidDid(value)\n } catch {\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid did`),\n }\n }\n\n return { success: true, value }\n}\n\nexport function handle(path: string, value: string): ValidationResult {\n try {\n ensureValidHandle(value)\n } catch {\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid handle`),\n }\n }\n\n return { success: true, value }\n}\n\nexport function atIdentifier(path: string, value: string): ValidationResult {\n // We can discriminate based on the \"did:\" prefix\n if (value.startsWith('did:')) {\n const didResult = did(path, value)\n if (didResult.success) return didResult\n } else {\n const handleResult = handle(path, value)\n if (handleResult.success) return handleResult\n }\n\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid did or a handle`),\n }\n}\n\nexport function nsid(path: string, value: string): ValidationResult {\n if (isValidNsid(value)) {\n return {\n success: true,\n value,\n }\n } else {\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid nsid`),\n }\n }\n}\n\nexport function cid(path: string, value: string): ValidationResult {\n try {\n CID.parse(value)\n } catch {\n return {\n success: false,\n error: new ValidationError(`${path} must be a cid string`),\n }\n }\n return { success: true, value }\n}\n\n// The language format validates well-formed BCP 47 language tags: https://www.rfc-editor.org/info/bcp47\nexport function language(path: string, value: string): ValidationResult {\n if (validateLanguage(value)) {\n return { success: true, value }\n }\n return {\n success: false,\n error: new ValidationError(\n `${path} must be a well-formed BCP 47 language tag`,\n ),\n }\n}\n\nexport function tid(path: string, value: string): ValidationResult {\n if (isValidTid(value)) {\n return { success: true, value }\n }\n\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid TID`),\n }\n}\n\nexport function recordKey(path: string, value: string): ValidationResult {\n try {\n ensureValidRecordKey(value)\n } catch {\n return {\n success: false,\n error: new ValidationError(`${path} must be a valid Record Key`),\n }\n }\n return { success: true, value }\n}\n"]}