@atproto/lexicon 0.3.3 → 0.4.1-rc.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 (62) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/blob-refs.d.ts +5 -4
  3. package/dist/blob-refs.d.ts.map +1 -0
  4. package/dist/blob-refs.js +82 -0
  5. package/dist/blob-refs.js.map +1 -0
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +20 -15097
  9. package/dist/index.js.map +1 -7
  10. package/dist/lexicons.d.ts +54 -2
  11. package/dist/lexicons.d.ts.map +1 -0
  12. package/dist/lexicons.js +242 -0
  13. package/dist/lexicons.js.map +1 -0
  14. package/dist/serialize.d.ts +1 -0
  15. package/dist/serialize.d.ts.map +1 -0
  16. package/dist/serialize.js +80 -0
  17. package/dist/serialize.js.map +1 -0
  18. package/dist/types.d.ts +4864 -4103
  19. package/dist/types.d.ts.map +1 -0
  20. package/dist/types.js +333 -0
  21. package/dist/types.js.map +1 -0
  22. package/dist/util.d.ts +3 -4
  23. package/dist/util.d.ts.map +1 -0
  24. package/dist/util.js +65 -0
  25. package/dist/util.js.map +1 -0
  26. package/dist/validation.d.ts +1 -0
  27. package/dist/validation.d.ts.map +1 -0
  28. package/dist/validation.js +49 -0
  29. package/dist/validation.js.map +1 -0
  30. package/dist/validators/blob.d.ts +1 -0
  31. package/dist/validators/blob.d.ts.map +1 -0
  32. package/dist/validators/blob.js +17 -0
  33. package/dist/validators/blob.js.map +1 -0
  34. package/dist/validators/complex.d.ts +3 -1
  35. package/dist/validators/complex.d.ts.map +1 -0
  36. package/dist/validators/complex.js +196 -0
  37. package/dist/validators/complex.js.map +1 -0
  38. package/dist/validators/formats.d.ts +3 -0
  39. package/dist/validators/formats.d.ts.map +1 -0
  40. package/dist/validators/formats.js +151 -0
  41. package/dist/validators/formats.js.map +1 -0
  42. package/dist/validators/primitives.d.ts +1 -0
  43. package/dist/validators/primitives.d.ts.map +1 -0
  44. package/dist/validators/primitives.js +293 -0
  45. package/dist/validators/primitives.js.map +1 -0
  46. package/dist/validators/xrpc.d.ts +1 -0
  47. package/dist/validators/xrpc.d.ts.map +1 -0
  48. package/dist/validators/xrpc.js +67 -0
  49. package/dist/validators/xrpc.js.map +1 -0
  50. package/jest.config.js +4 -3
  51. package/package.json +10 -9
  52. package/src/lexicons.ts +18 -3
  53. package/src/types.ts +2 -0
  54. package/src/util.ts +2 -95
  55. package/src/validation.ts +18 -5
  56. package/src/validators/complex.ts +102 -11
  57. package/src/validators/formats.ts +28 -0
  58. package/src/validators/primitives.ts +4 -0
  59. package/tsconfig.build.json +6 -2
  60. package/tsconfig.json +3 -10
  61. package/tsconfig.tests.json +7 -0
  62. package/build.js +0 -14
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateOneOf = exports.object = exports.array = exports.validate = void 0;
4
+ const types_1 = require("../types");
5
+ const util_1 = require("../util");
6
+ const blob_1 = require("./blob");
7
+ const primitives_1 = require("./primitives");
8
+ function validate(lexicons, path, def, value) {
9
+ switch (def.type) {
10
+ case 'boolean':
11
+ return (0, primitives_1.boolean)(lexicons, path, def, value);
12
+ case 'integer':
13
+ return (0, primitives_1.integer)(lexicons, path, def, value);
14
+ case 'string':
15
+ return (0, primitives_1.string)(lexicons, path, def, value);
16
+ case 'bytes':
17
+ return (0, primitives_1.bytes)(lexicons, path, def, value);
18
+ case 'cid-link':
19
+ return (0, primitives_1.cidLink)(lexicons, path, def, value);
20
+ case 'unknown':
21
+ return (0, primitives_1.unknown)(lexicons, path, def, value);
22
+ case 'object':
23
+ return object(lexicons, path, def, value);
24
+ case 'array':
25
+ return array(lexicons, path, def, value);
26
+ case 'blob':
27
+ return (0, blob_1.blob)(lexicons, path, def, value);
28
+ default:
29
+ return {
30
+ success: false,
31
+ error: new types_1.ValidationError(`Unexpected lexicon type: ${def.type}`),
32
+ };
33
+ }
34
+ }
35
+ exports.validate = validate;
36
+ function array(lexicons, path, def, value) {
37
+ // type
38
+ if (!Array.isArray(value)) {
39
+ return {
40
+ success: false,
41
+ error: new types_1.ValidationError(`${path} must be an array`),
42
+ };
43
+ }
44
+ // maxLength
45
+ if (typeof def.maxLength === 'number') {
46
+ if (value.length > def.maxLength) {
47
+ return {
48
+ success: false,
49
+ error: new types_1.ValidationError(`${path} must not have more than ${def.maxLength} elements`),
50
+ };
51
+ }
52
+ }
53
+ // minLength
54
+ if (typeof def.minLength === 'number') {
55
+ if (value.length < def.minLength) {
56
+ return {
57
+ success: false,
58
+ error: new types_1.ValidationError(`${path} must not have fewer than ${def.minLength} elements`),
59
+ };
60
+ }
61
+ }
62
+ // items
63
+ const itemsDef = def.items;
64
+ for (let i = 0; i < value.length; i++) {
65
+ const itemValue = value[i];
66
+ const itemPath = `${path}/${i}`;
67
+ const res = validateOneOf(lexicons, itemPath, itemsDef, itemValue);
68
+ if (!res.success) {
69
+ return res;
70
+ }
71
+ }
72
+ return { success: true, value };
73
+ }
74
+ exports.array = array;
75
+ function object(lexicons, path, def, value) {
76
+ def = def;
77
+ // type
78
+ if (!value || typeof value !== 'object') {
79
+ return {
80
+ success: false,
81
+ error: new types_1.ValidationError(`${path} must be an object`),
82
+ };
83
+ }
84
+ const requiredProps = new Set(def.required);
85
+ const nullableProps = new Set(def.nullable);
86
+ // properties
87
+ let resultValue = value;
88
+ if (typeof def.properties === 'object') {
89
+ for (const key in def.properties) {
90
+ if (value[key] === null && nullableProps.has(key)) {
91
+ continue;
92
+ }
93
+ const propDef = def.properties[key];
94
+ if (typeof value[key] === 'undefined' && !requiredProps.has(key)) {
95
+ // Fast path for non-required undefined props.
96
+ if (propDef.type === 'integer' ||
97
+ propDef.type === 'boolean' ||
98
+ propDef.type === 'string') {
99
+ if (typeof propDef.default === 'undefined') {
100
+ continue;
101
+ }
102
+ }
103
+ else {
104
+ // Other types have no defaults.
105
+ continue;
106
+ }
107
+ }
108
+ const propPath = `${path}/${key}`;
109
+ const validated = validateOneOf(lexicons, propPath, propDef, value[key]);
110
+ const propValue = validated.success ? validated.value : value[key];
111
+ const propIsUndefined = typeof propValue === 'undefined';
112
+ // Return error for bad validation, giving required rule precedence
113
+ if (propIsUndefined && requiredProps.has(key)) {
114
+ return {
115
+ success: false,
116
+ error: new types_1.ValidationError(`${path} must have the property "${key}"`),
117
+ };
118
+ }
119
+ else if (!propIsUndefined && !validated.success) {
120
+ return validated;
121
+ }
122
+ // Adjust value based on e.g. applied defaults, cloning shallowly if there was a changed value
123
+ if (propValue !== value[key]) {
124
+ if (resultValue === value) {
125
+ // Lazy shallow clone
126
+ resultValue = { ...value };
127
+ }
128
+ resultValue[key] = propValue;
129
+ }
130
+ }
131
+ }
132
+ return { success: true, value: resultValue };
133
+ }
134
+ exports.object = object;
135
+ function validateOneOf(lexicons, path, def, value, mustBeObj = false) {
136
+ let error;
137
+ let concreteDefs;
138
+ if (def.type === 'union') {
139
+ if (!(0, types_1.isDiscriminatedObject)(value)) {
140
+ return {
141
+ success: false,
142
+ error: new types_1.ValidationError(`${path} must be an object which includes the "$type" property`),
143
+ };
144
+ }
145
+ if (!refsContainType(def.refs, value.$type)) {
146
+ if (def.closed) {
147
+ return {
148
+ success: false,
149
+ error: new types_1.ValidationError(`${path} $type must be one of ${def.refs.join(', ')}`),
150
+ };
151
+ }
152
+ return { success: true, value };
153
+ }
154
+ else {
155
+ concreteDefs = (0, util_1.toConcreteTypes)(lexicons, {
156
+ type: 'ref',
157
+ ref: value.$type,
158
+ });
159
+ }
160
+ }
161
+ else {
162
+ concreteDefs = (0, util_1.toConcreteTypes)(lexicons, def);
163
+ }
164
+ for (const concreteDef of concreteDefs) {
165
+ const result = mustBeObj
166
+ ? object(lexicons, path, concreteDef, value)
167
+ : validate(lexicons, path, concreteDef, value);
168
+ if (result.success) {
169
+ return result;
170
+ }
171
+ error ?? (error = result.error);
172
+ }
173
+ if (concreteDefs.length > 1) {
174
+ return {
175
+ success: false,
176
+ error: new types_1.ValidationError(`${path} did not match any of the expected definitions`),
177
+ };
178
+ }
179
+ return { success: false, error };
180
+ }
181
+ exports.validateOneOf = validateOneOf;
182
+ // to avoid bugs like #0189 this needs to handle both
183
+ // explicit and implicit #main
184
+ const refsContainType = (refs, type) => {
185
+ const lexUri = (0, util_1.toLexUri)(type);
186
+ if (refs.includes(lexUri)) {
187
+ return true;
188
+ }
189
+ if (lexUri.endsWith('#main')) {
190
+ return refs.includes(lexUri.replace('#main', ''));
191
+ }
192
+ else {
193
+ return refs.includes(lexUri + '#main');
194
+ }
195
+ };
196
+ //# sourceMappingURL=complex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complex.js","sourceRoot":"","sources":["../../src/validators/complex.ts"],"names":[],"mappings":"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"}
@@ -8,3 +8,6 @@ export declare function atIdentifier(path: string, value: string): ValidationRes
8
8
  export declare function nsid(path: string, value: string): ValidationResult;
9
9
  export declare function cid(path: string, value: string): ValidationResult;
10
10
  export declare function language(path: string, value: string): ValidationResult;
11
+ export declare function tid(path: string, value: string): ValidationResult;
12
+ export declare function recordKey(path: string, value: string): ValidationResult;
13
+ //# sourceMappingURL=formats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formats.d.ts","sourceRoot":"","sources":["../../src/validators/formats.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,UAAU,CAAA;AAW5D,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,CASjE;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAUnE;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAUjE;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAUpE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAY1E;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAUlE;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,CAYjE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAUvE"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.recordKey = exports.tid = exports.language = exports.cid = exports.nsid = exports.atIdentifier = exports.handle = exports.did = exports.atUri = exports.uri = exports.datetime = void 0;
4
+ const iso_datestring_validator_1 = require("iso-datestring-validator");
5
+ const cid_1 = require("multiformats/cid");
6
+ const types_1 = require("../types");
7
+ const syntax_1 = require("@atproto/syntax");
8
+ const common_web_1 = require("@atproto/common-web");
9
+ function datetime(path, value) {
10
+ try {
11
+ if (!(0, iso_datestring_validator_1.isValidISODateString)(value)) {
12
+ throw new Error();
13
+ }
14
+ }
15
+ catch {
16
+ return {
17
+ success: false,
18
+ error: new types_1.ValidationError(`${path} must be an valid atproto datetime (both RFC-3339 and ISO-8601)`),
19
+ };
20
+ }
21
+ return { success: true, value };
22
+ }
23
+ exports.datetime = datetime;
24
+ function uri(path, value) {
25
+ const isUri = value.match(/^\w+:(?:\/\/)?[^\s/][^\s]*$/) !== null;
26
+ if (!isUri) {
27
+ return {
28
+ success: false,
29
+ error: new types_1.ValidationError(`${path} must be a uri`),
30
+ };
31
+ }
32
+ return { success: true, value };
33
+ }
34
+ exports.uri = uri;
35
+ function atUri(path, value) {
36
+ try {
37
+ (0, syntax_1.ensureValidAtUri)(value);
38
+ }
39
+ catch {
40
+ return {
41
+ success: false,
42
+ error: new types_1.ValidationError(`${path} must be a valid at-uri`),
43
+ };
44
+ }
45
+ return { success: true, value };
46
+ }
47
+ exports.atUri = atUri;
48
+ function did(path, value) {
49
+ try {
50
+ (0, syntax_1.ensureValidDid)(value);
51
+ }
52
+ catch {
53
+ return {
54
+ success: false,
55
+ error: new types_1.ValidationError(`${path} must be a valid did`),
56
+ };
57
+ }
58
+ return { success: true, value };
59
+ }
60
+ exports.did = did;
61
+ function handle(path, value) {
62
+ try {
63
+ (0, syntax_1.ensureValidHandle)(value);
64
+ }
65
+ catch {
66
+ return {
67
+ success: false,
68
+ error: new types_1.ValidationError(`${path} must be a valid handle`),
69
+ };
70
+ }
71
+ return { success: true, value };
72
+ }
73
+ exports.handle = handle;
74
+ function atIdentifier(path, value) {
75
+ const isDid = did(path, value);
76
+ if (!isDid.success) {
77
+ const isHandle = handle(path, value);
78
+ if (!isHandle.success) {
79
+ return {
80
+ success: false,
81
+ error: new types_1.ValidationError(`${path} must be a valid did or a handle`),
82
+ };
83
+ }
84
+ }
85
+ return { success: true, value };
86
+ }
87
+ exports.atIdentifier = atIdentifier;
88
+ function nsid(path, value) {
89
+ try {
90
+ (0, syntax_1.ensureValidNsid)(value);
91
+ }
92
+ catch {
93
+ return {
94
+ success: false,
95
+ error: new types_1.ValidationError(`${path} must be a valid nsid`),
96
+ };
97
+ }
98
+ return { success: true, value };
99
+ }
100
+ exports.nsid = nsid;
101
+ function cid(path, value) {
102
+ try {
103
+ cid_1.CID.parse(value);
104
+ }
105
+ catch {
106
+ return {
107
+ success: false,
108
+ error: new types_1.ValidationError(`${path} must be a cid string`),
109
+ };
110
+ }
111
+ return { success: true, value };
112
+ }
113
+ exports.cid = cid;
114
+ // The language format validates well-formed BCP 47 language tags: https://www.rfc-editor.org/info/bcp47
115
+ function language(path, value) {
116
+ if ((0, common_web_1.validateLanguage)(value)) {
117
+ return { success: true, value };
118
+ }
119
+ return {
120
+ success: false,
121
+ error: new types_1.ValidationError(`${path} must be a well-formed BCP 47 language tag`),
122
+ };
123
+ }
124
+ exports.language = language;
125
+ function tid(path, value) {
126
+ try {
127
+ (0, syntax_1.ensureValidTid)(value);
128
+ }
129
+ catch {
130
+ return {
131
+ success: false,
132
+ error: new types_1.ValidationError(`${path} must be a valid TID (timestamp identifier)`),
133
+ };
134
+ }
135
+ return { success: true, value };
136
+ }
137
+ exports.tid = tid;
138
+ function recordKey(path, value) {
139
+ try {
140
+ (0, syntax_1.ensureValidRecordKey)(value);
141
+ }
142
+ catch {
143
+ return {
144
+ success: false,
145
+ error: new types_1.ValidationError(`${path} must be a valid Record Key`),
146
+ };
147
+ }
148
+ return { success: true, value };
149
+ }
150
+ exports.recordKey = recordKey;
151
+ //# sourceMappingURL=formats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formats.js","sourceRoot":"","sources":["../../src/validators/formats.ts"],"names":[],"mappings":"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"}
@@ -7,3 +7,4 @@ export declare function string(lexicons: Lexicons, path: string, def: LexUserTyp
7
7
  export declare function bytes(lexicons: Lexicons, path: string, def: LexUserType, value: unknown): ValidationResult;
8
8
  export declare function cidLink(lexicons: Lexicons, path: string, def: LexUserType, value: unknown): ValidationResult;
9
9
  export declare function unknown(lexicons: Lexicons, path: string, def: LexUserType, value: unknown): ValidationResult;
10
+ //# sourceMappingURL=primitives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/validators/primitives.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EACL,WAAW,EAIX,gBAAgB,EAGjB,MAAM,UAAU,CAAA;AAEjB,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAoBlB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CA+BlB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAmElB;AAED,wBAAgB,MAAM,CACpB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAqHlB;AAED,wBAAgB,KAAK,CACnB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAmClB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CASlB;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,GACb,gBAAgB,CAUlB"}
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.unknown = exports.cidLink = exports.bytes = exports.string = exports.integer = exports.boolean = exports.validate = void 0;
27
+ const common_web_1 = require("@atproto/common-web");
28
+ const cid_1 = require("multiformats/cid");
29
+ const formats = __importStar(require("./formats"));
30
+ const types_1 = require("../types");
31
+ function validate(lexicons, path, def, value) {
32
+ switch (def.type) {
33
+ case 'boolean':
34
+ return boolean(lexicons, path, def, value);
35
+ case 'integer':
36
+ return integer(lexicons, path, def, value);
37
+ case 'string':
38
+ return string(lexicons, path, def, value);
39
+ case 'bytes':
40
+ return bytes(lexicons, path, def, value);
41
+ case 'cid-link':
42
+ return cidLink(lexicons, path, def, value);
43
+ case 'unknown':
44
+ return unknown(lexicons, path, def, value);
45
+ default:
46
+ return {
47
+ success: false,
48
+ error: new types_1.ValidationError(`Unexpected lexicon type: ${def.type}`),
49
+ };
50
+ }
51
+ }
52
+ exports.validate = validate;
53
+ function boolean(lexicons, path, def, value) {
54
+ def = def;
55
+ // type
56
+ const type = typeof value;
57
+ if (type === 'undefined') {
58
+ if (typeof def.default === 'boolean') {
59
+ return { success: true, value: def.default };
60
+ }
61
+ return {
62
+ success: false,
63
+ error: new types_1.ValidationError(`${path} must be a boolean`),
64
+ };
65
+ }
66
+ else if (type !== 'boolean') {
67
+ return {
68
+ success: false,
69
+ error: new types_1.ValidationError(`${path} must be a boolean`),
70
+ };
71
+ }
72
+ // const
73
+ if (typeof def.const === 'boolean') {
74
+ if (value !== def.const) {
75
+ return {
76
+ success: false,
77
+ error: new types_1.ValidationError(`${path} must be ${def.const}`),
78
+ };
79
+ }
80
+ }
81
+ return { success: true, value };
82
+ }
83
+ exports.boolean = boolean;
84
+ function integer(lexicons, path, def, value) {
85
+ def = def;
86
+ // type
87
+ const type = typeof value;
88
+ if (type === 'undefined') {
89
+ if (typeof def.default === 'number') {
90
+ return { success: true, value: def.default };
91
+ }
92
+ return {
93
+ success: false,
94
+ error: new types_1.ValidationError(`${path} must be an integer`),
95
+ };
96
+ }
97
+ else if (!Number.isInteger(value)) {
98
+ return {
99
+ success: false,
100
+ error: new types_1.ValidationError(`${path} must be an integer`),
101
+ };
102
+ }
103
+ // const
104
+ if (typeof def.const === 'number') {
105
+ if (value !== def.const) {
106
+ return {
107
+ success: false,
108
+ error: new types_1.ValidationError(`${path} must be ${def.const}`),
109
+ };
110
+ }
111
+ }
112
+ // enum
113
+ if (Array.isArray(def.enum)) {
114
+ if (!def.enum.includes(value)) {
115
+ return {
116
+ success: false,
117
+ error: new types_1.ValidationError(`${path} must be one of (${def.enum.join('|')})`),
118
+ };
119
+ }
120
+ }
121
+ // maximum
122
+ if (typeof def.maximum === 'number') {
123
+ if (value > def.maximum) {
124
+ return {
125
+ success: false,
126
+ error: new types_1.ValidationError(`${path} can not be greater than ${def.maximum}`),
127
+ };
128
+ }
129
+ }
130
+ // minimum
131
+ if (typeof def.minimum === 'number') {
132
+ if (value < def.minimum) {
133
+ return {
134
+ success: false,
135
+ error: new types_1.ValidationError(`${path} can not be less than ${def.minimum}`),
136
+ };
137
+ }
138
+ }
139
+ return { success: true, value };
140
+ }
141
+ exports.integer = integer;
142
+ function string(lexicons, path, def, value) {
143
+ def = def;
144
+ // type
145
+ if (typeof value === 'undefined') {
146
+ if (typeof def.default === 'string') {
147
+ return { success: true, value: def.default };
148
+ }
149
+ return {
150
+ success: false,
151
+ error: new types_1.ValidationError(`${path} must be a string`),
152
+ };
153
+ }
154
+ else if (typeof value !== 'string') {
155
+ return {
156
+ success: false,
157
+ error: new types_1.ValidationError(`${path} must be a string`),
158
+ };
159
+ }
160
+ // const
161
+ if (typeof def.const === 'string') {
162
+ if (value !== def.const) {
163
+ return {
164
+ success: false,
165
+ error: new types_1.ValidationError(`${path} must be ${def.const}`),
166
+ };
167
+ }
168
+ }
169
+ // enum
170
+ if (Array.isArray(def.enum)) {
171
+ if (!def.enum.includes(value)) {
172
+ return {
173
+ success: false,
174
+ error: new types_1.ValidationError(`${path} must be one of (${def.enum.join('|')})`),
175
+ };
176
+ }
177
+ }
178
+ // maxLength
179
+ if (typeof def.maxLength === 'number') {
180
+ if ((0, common_web_1.utf8Len)(value) > def.maxLength) {
181
+ return {
182
+ success: false,
183
+ error: new types_1.ValidationError(`${path} must not be longer than ${def.maxLength} characters`),
184
+ };
185
+ }
186
+ }
187
+ // minLength
188
+ if (typeof def.minLength === 'number') {
189
+ if ((0, common_web_1.utf8Len)(value) < def.minLength) {
190
+ return {
191
+ success: false,
192
+ error: new types_1.ValidationError(`${path} must not be shorter than ${def.minLength} characters`),
193
+ };
194
+ }
195
+ }
196
+ // maxGraphemes
197
+ if (typeof def.maxGraphemes === 'number') {
198
+ if ((0, common_web_1.graphemeLen)(value) > def.maxGraphemes) {
199
+ return {
200
+ success: false,
201
+ error: new types_1.ValidationError(`${path} must not be longer than ${def.maxGraphemes} graphemes`),
202
+ };
203
+ }
204
+ }
205
+ // minGraphemes
206
+ if (typeof def.minGraphemes === 'number') {
207
+ if ((0, common_web_1.graphemeLen)(value) < def.minGraphemes) {
208
+ return {
209
+ success: false,
210
+ error: new types_1.ValidationError(`${path} must not be shorter than ${def.minGraphemes} graphemes`),
211
+ };
212
+ }
213
+ }
214
+ if (typeof def.format === 'string') {
215
+ switch (def.format) {
216
+ case 'datetime':
217
+ return formats.datetime(path, value);
218
+ case 'uri':
219
+ return formats.uri(path, value);
220
+ case 'at-uri':
221
+ return formats.atUri(path, value);
222
+ case 'did':
223
+ return formats.did(path, value);
224
+ case 'handle':
225
+ return formats.handle(path, value);
226
+ case 'at-identifier':
227
+ return formats.atIdentifier(path, value);
228
+ case 'nsid':
229
+ return formats.nsid(path, value);
230
+ case 'cid':
231
+ return formats.cid(path, value);
232
+ case 'language':
233
+ return formats.language(path, value);
234
+ case 'tid':
235
+ return formats.tid(path, value);
236
+ case 'record-key':
237
+ return formats.recordKey(path, value);
238
+ }
239
+ }
240
+ return { success: true, value };
241
+ }
242
+ exports.string = string;
243
+ function bytes(lexicons, path, def, value) {
244
+ def = def;
245
+ if (!value || !(value instanceof Uint8Array)) {
246
+ return {
247
+ success: false,
248
+ error: new types_1.ValidationError(`${path} must be a byte array`),
249
+ };
250
+ }
251
+ // maxLength
252
+ if (typeof def.maxLength === 'number') {
253
+ if (value.byteLength > def.maxLength) {
254
+ return {
255
+ success: false,
256
+ error: new types_1.ValidationError(`${path} must not be larger than ${def.maxLength} bytes`),
257
+ };
258
+ }
259
+ }
260
+ // minLength
261
+ if (typeof def.minLength === 'number') {
262
+ if (value.byteLength < def.minLength) {
263
+ return {
264
+ success: false,
265
+ error: new types_1.ValidationError(`${path} must not be smaller than ${def.minLength} bytes`),
266
+ };
267
+ }
268
+ }
269
+ return { success: true, value };
270
+ }
271
+ exports.bytes = bytes;
272
+ function cidLink(lexicons, path, def, value) {
273
+ if (cid_1.CID.asCID(value) === null) {
274
+ return {
275
+ success: false,
276
+ error: new types_1.ValidationError(`${path} must be a CID`),
277
+ };
278
+ }
279
+ return { success: true, value };
280
+ }
281
+ exports.cidLink = cidLink;
282
+ function unknown(lexicons, path, def, value) {
283
+ // type
284
+ if (!value || typeof value !== 'object') {
285
+ return {
286
+ success: false,
287
+ error: new types_1.ValidationError(`${path} must be an object`),
288
+ };
289
+ }
290
+ return { success: true, value };
291
+ }
292
+ exports.unknown = unknown;
293
+ //# sourceMappingURL=primitives.js.map