@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.
- package/CHANGELOG.md +28 -0
- package/dist/blob-refs.d.ts +4 -4
- package/dist/blob-refs.d.ts.map +1 -1
- package/dist/blob-refs.js +20 -46
- package/dist/blob-refs.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -20
- package/dist/index.js.map +1 -1
- package/dist/lexicons.d.ts +1 -1
- package/dist/lexicons.d.ts.map +1 -1
- package/dist/lexicons.js +40 -54
- package/dist/lexicons.js.map +1 -1
- package/dist/serialize.d.ts.map +1 -1
- package/dist/serialize.js +22 -32
- package/dist/serialize.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +193 -204
- package/dist/types.js.map +1 -1
- package/dist/util.js +6 -10
- package/dist/util.js.map +1 -1
- package/dist/validation.d.ts +2 -2
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +10 -17
- package/dist/validation.js.map +1 -1
- package/dist/validators/blob.d.ts +2 -2
- package/dist/validators/blob.d.ts.map +1 -1
- package/dist/validators/blob.js +5 -8
- package/dist/validators/blob.js.map +1 -1
- package/dist/validators/complex.d.ts +2 -2
- package/dist/validators/complex.d.ts.map +1 -1
- package/dist/validators/complex.js +20 -26
- package/dist/validators/complex.js.map +1 -1
- package/dist/validators/formats.d.ts +1 -1
- package/dist/validators/formats.d.ts.map +1 -1
- package/dist/validators/formats.js +38 -51
- package/dist/validators/formats.js.map +1 -1
- package/dist/validators/primitives.d.ts +2 -2
- package/dist/validators/primitives.d.ts.map +1 -1
- package/dist/validators/primitives.js +33 -69
- package/dist/validators/primitives.js.map +1 -1
- package/dist/validators/xrpc.d.ts +2 -2
- package/dist/validators/xrpc.d.ts.map +1 -1
- package/dist/validators/xrpc.js +6 -42
- package/dist/validators/xrpc.js.map +1 -1
- package/{jest.config.js → jest.config.cjs} +8 -1
- package/package.json +17 -9
- package/src/blob-refs.ts +0 -2
- package/src/index.ts +4 -4
- package/src/lexicons.ts +4 -4
- package/src/serialize.ts +1 -3
- package/src/types.ts +1 -3
- package/src/validation.ts +4 -4
- package/src/validators/blob.ts +3 -3
- package/src/validators/complex.ts +5 -5
- package/src/validators/formats.ts +3 -4
- package/src/validators/primitives.ts +3 -3
- package/src/validators/xrpc.ts +8 -4
- package/tests/_scaffolds/lexicons.ts +1 -1
- package/tests/general.test.ts +5 -5
- package/tsconfig.build.tsbuildinfo +1 -1
package/dist/util.js
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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":"
|
|
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"]}
|
package/dist/validation.d.ts
CHANGED
|
@@ -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;
|
package/dist/validation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
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"}
|
package/dist/validation.js
CHANGED
|
@@ -1,46 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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 =
|
|
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 =
|
|
36
|
+
const res = validateOneOf(lexicons, path, def, value, mustBeObj);
|
|
44
37
|
if (!res.success)
|
|
45
38
|
throw res.error;
|
|
46
39
|
return res.value;
|
package/dist/validation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"
|
|
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,
|
|
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"}
|
package/dist/validators/blob.js
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
|
5
|
+
if (!value || !(value instanceof BlobRef)) {
|
|
9
6
|
return {
|
|
10
7
|
success: false,
|
|
11
|
-
error: new
|
|
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":"
|
|
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,
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
12
|
+
return blob(lexicons, path, def, value);
|
|
19
13
|
default:
|
|
20
|
-
return (
|
|
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
|
|
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
|
|
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
|
|
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 (!
|
|
57
|
+
if (!isObj(value)) {
|
|
64
58
|
return {
|
|
65
59
|
success: false,
|
|
66
|
-
error: new
|
|
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
|
|
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 (!
|
|
118
|
+
if (!isDiscriminatedObject(value)) {
|
|
125
119
|
return {
|
|
126
120
|
success: false,
|
|
127
|
-
error: new
|
|
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
|
|
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 =
|
|
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":"
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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 (!
|
|
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
|
|
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 (!
|
|
21
|
+
export function uri(path, value) {
|
|
22
|
+
if (!isValidUri(value)) {
|
|
36
23
|
return {
|
|
37
24
|
success: false,
|
|
38
|
-
error: new
|
|
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
|
-
|
|
32
|
+
ensureValidAtUri(value);
|
|
46
33
|
}
|
|
47
34
|
catch {
|
|
48
35
|
return {
|
|
49
36
|
success: false,
|
|
50
|
-
error: new
|
|
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
|
-
|
|
44
|
+
ensureValidDid(value);
|
|
58
45
|
}
|
|
59
46
|
catch {
|
|
60
47
|
return {
|
|
61
48
|
success: false,
|
|
62
|
-
error: new
|
|
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
|
-
|
|
56
|
+
ensureValidHandle(value);
|
|
70
57
|
}
|
|
71
58
|
catch {
|
|
72
59
|
return {
|
|
73
60
|
success: false,
|
|
74
|
-
error: new
|
|
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
|
|
80
|
+
error: new ValidationError(`${path} must be a valid did or a handle`),
|
|
94
81
|
};
|
|
95
82
|
}
|
|
96
|
-
function nsid(path, value) {
|
|
97
|
-
if (
|
|
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
|
|
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
|
-
|
|
99
|
+
CID.parse(value);
|
|
113
100
|
}
|
|
114
101
|
catch {
|
|
115
102
|
return {
|
|
116
103
|
success: false,
|
|
117
|
-
error: new
|
|
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 (
|
|
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
|
|
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 (
|
|
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
|
|
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
|
-
|
|
130
|
+
ensureValidRecordKey(value);
|
|
144
131
|
}
|
|
145
132
|
catch {
|
|
146
133
|
return {
|
|
147
134
|
success: false,
|
|
148
|
-
error: new
|
|
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":"
|
|
1
|
+
{"version":3,"file":"formats.js","sourceRoot":"","sources":["../../src/validators/formats.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,MAAM,0BAA0B,CAAA;AAC7D,MAAM,EAAE,oBAAoB,EAAE,GAAG,sBAAsB,CAAA;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,UAAU,GACX,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,eAAe,EAAoB,MAAM,aAAa,CAAA;AAE/D,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,KAAa;IAClD,IAAI,CAAC;QACH,IAAI,CAAC,oBAAoB,CAAC,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,eAAe,CACxB,GAAG,IAAI,iEAAiE,CACzE;SACF,CAAA;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,KAAa;IAC7C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,eAAe,CAAC,GAAG,IAAI,gBAAgB,CAAC;SACpD,CAAA;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,KAAa;IAC/C,IAAI,CAAC;QACH,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,eAAe,CAAC,GAAG,IAAI,yBAAyB,CAAC;SAC7D,CAAA;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,KAAa;IAC7C,IAAI,CAAC;QACH,cAAc,CAAC,KAAK,CAAC,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,eAAe,CAAC,GAAG,IAAI,sBAAsB,CAAC;SAC1D,CAAA;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,KAAa;IAChD,IAAI,CAAC;QACH,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,eAAe,CAAC,GAAG,IAAI,yBAAyB,CAAC;SAC7D,CAAA;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,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,eAAe,CAAC,GAAG,IAAI,kCAAkC,CAAC;KACtE,CAAA;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY,EAAE,KAAa;IAC9C,IAAI,WAAW,CAAC,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,eAAe,CAAC,GAAG,IAAI,uBAAuB,CAAC;SAC3D,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,KAAa;IAC7C,IAAI,CAAC;QACH,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,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;AAED,wGAAwG;AACxG,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,KAAa;IAClD,IAAI,gBAAgB,CAAC,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,eAAe,CACxB,GAAG,IAAI,4CAA4C,CACpD;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,KAAa;IAC7C,IAAI,UAAU,CAAC,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,eAAe,CAAC,GAAG,IAAI,sBAAsB,CAAC;KAC1D,CAAA;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,KAAa;IACnD,IAAI,CAAC;QACH,oBAAoB,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,eAAe,CAAC,GAAG,IAAI,6BAA6B,CAAC;SACjE,CAAA;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC","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"]}
|