justus 0.4.1 → 0.5.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/README.md +78 -0
- package/dist/dts-generator.cjs +36 -22
- package/dist/dts-generator.cjs.map +1 -1
- package/dist/dts-generator.d.ts +1 -1
- package/dist/dts-generator.mjs +15 -22
- package/dist/dts-generator.mjs.map +1 -1
- package/dist/errors.cjs +3 -3
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.mjs +3 -3
- package/dist/errors.mjs.map +1 -1
- package/dist/extra/arn.cjs +98 -0
- package/dist/extra/arn.cjs.map +6 -0
- package/dist/extra/arn.d.ts +71 -0
- package/dist/extra/arn.mjs +68 -0
- package/dist/extra/arn.mjs.map +6 -0
- package/dist/extra/ean13.cjs +52 -0
- package/dist/extra/ean13.cjs.map +6 -0
- package/dist/extra/ean13.d.ts +9 -0
- package/dist/extra/ean13.mjs +26 -0
- package/dist/extra/ean13.mjs.map +6 -0
- package/dist/{validators → extra}/url.cjs +10 -10
- package/dist/extra/url.cjs.map +6 -0
- package/dist/{validators → extra}/url.d.ts +4 -5
- package/dist/{validators → extra}/url.mjs +8 -9
- package/dist/{validators → extra}/url.mjs.map +3 -3
- package/dist/extra/uuid.cjs +45 -0
- package/dist/extra/uuid.cjs.map +6 -0
- package/dist/extra/uuid.d.ts +10 -0
- package/dist/extra/uuid.mjs +18 -0
- package/dist/extra/uuid.mjs.map +6 -0
- package/dist/index.cjs +0 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +18 -19
- package/dist/index.mjs +12 -15
- package/dist/index.mjs.map +1 -1
- package/dist/registry.cjs +44 -0
- package/dist/registry.cjs.map +6 -0
- package/dist/registry.d.ts +16 -0
- package/dist/registry.mjs +19 -0
- package/dist/registry.mjs.map +6 -0
- package/dist/schema.cjs +3 -5
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.ts +6 -5
- package/dist/schema.mjs +3 -4
- package/dist/schema.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.ts +38 -12
- package/dist/types.mjs.map +1 -1
- package/dist/utilities.cjs +5 -7
- package/dist/utilities.cjs.map +1 -1
- package/dist/utilities.mjs +5 -7
- package/dist/utilities.mjs.map +1 -1
- package/dist/validators/array.cjs +4 -2
- package/dist/validators/array.cjs.map +1 -1
- package/dist/validators/array.d.ts +3 -4
- package/dist/validators/array.mjs +3 -2
- package/dist/validators/array.mjs.map +1 -1
- package/dist/validators/boolean.cjs +6 -4
- package/dist/validators/boolean.cjs.map +1 -1
- package/dist/validators/boolean.d.ts +2 -3
- package/dist/validators/boolean.mjs +4 -3
- package/dist/validators/boolean.mjs.map +1 -1
- package/dist/validators/constant.cjs +4 -5
- package/dist/validators/constant.cjs.map +1 -1
- package/dist/validators/constant.d.ts +0 -2
- package/dist/validators/constant.mjs +3 -3
- package/dist/validators/constant.mjs.map +1 -1
- package/dist/validators/date.cjs +8 -10
- package/dist/validators/date.cjs.map +1 -1
- package/dist/validators/date.d.ts +3 -4
- package/dist/validators/date.mjs +6 -9
- package/dist/validators/date.mjs.map +1 -1
- package/dist/validators/number.cjs +6 -4
- package/dist/validators/number.cjs.map +1 -1
- package/dist/validators/number.d.ts +5 -6
- package/dist/validators/number.mjs +4 -3
- package/dist/validators/number.mjs.map +1 -1
- package/dist/validators/object.cjs +7 -4
- package/dist/validators/object.cjs.map +1 -1
- package/dist/validators/object.d.ts +6 -7
- package/dist/validators/object.mjs +7 -9
- package/dist/validators/object.mjs.map +1 -1
- package/dist/validators/optional.cjs.map +1 -1
- package/dist/validators/optional.d.ts +5 -4
- package/dist/validators/optional.mjs.map +1 -1
- package/dist/validators/string.cjs +6 -4
- package/dist/validators/string.cjs.map +1 -1
- package/dist/validators/string.d.ts +5 -6
- package/dist/validators/string.mjs +4 -3
- package/dist/validators/string.mjs.map +1 -1
- package/dist/validators/tuple.cjs +3 -2
- package/dist/validators/tuple.cjs.map +1 -1
- package/dist/validators/tuple.d.ts +3 -3
- package/dist/validators/tuple.mjs +3 -2
- package/dist/validators/tuple.mjs.map +1 -1
- package/dist/validators/union.cjs.map +1 -1
- package/dist/validators/union.d.ts +9 -7
- package/dist/validators/union.mjs.map +1 -1
- package/package.json +46 -6
- package/src/dts-generator.ts +17 -27
- package/src/extra/arn.ts +151 -0
- package/src/extra/ean13.ts +31 -0
- package/src/{validators → extra}/url.ts +6 -8
- package/src/extra/uuid.ts +18 -0
- package/src/index.ts +18 -19
- package/src/registry.ts +28 -0
- package/src/schema.ts +10 -11
- package/src/types.ts +80 -11
- package/src/utilities.ts +5 -9
- package/src/validators/array.ts +3 -3
- package/src/validators/boolean.ts +2 -2
- package/src/validators/constant.ts +3 -2
- package/src/validators/date.ts +9 -9
- package/src/validators/number.ts +6 -7
- package/src/validators/object.ts +15 -14
- package/src/validators/optional.ts +9 -7
- package/src/validators/string.ts +6 -6
- package/src/validators/tuple.ts +20 -6
- package/src/validators/union.ts +35 -10
- package/dist/validators/url.cjs.map +0 -6
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/validators/tuple.ts"],
|
|
4
|
-
"mappings": ";AAAA,SAAS,kBAAkB,uBAAuB;AAClD,SAAS,
|
|
4
|
+
"mappings": ";AAAA,SAAS,kBAAkB,uBAAuB;AAClD,SAAS,gBAAgB;AACzB,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAetB,IAAM,iBAAN,cAA8C,kBAAqD;AAAA,EAC/F;AAAA,EACA;AAAA,EAET,YAAYA,QAAU;AACpB,UAAM;AAEN,UAAM,UAAyB,CAAC;AAChC,eAAW,QAAQA,QAAO;AACxB,UAAI,SAAS,MAAM;AACjB,gBAAQ,KAAK,EAAE,QAAQ,MAAM,WAAW,aAAa,IAAI,EAAE,CAAC;AAAA,MAC9D,WAAY,OAAO,SAAS,YAAc,OAAO,uBAAuB,MAAO;AAC7E,gBAAQ,KAAK,EAAE,QAAQ,OAAO,WAAiB,KAAM,OAAO,mBAAmB,EAAE,CAAC;AAAA,MACpF,OAAO;AACL,gBAAQ,KAAK,EAAE,QAAQ,MAAM,WAAW,aAAa,IAAI,EAAE,CAAC;AAAA,MAC9D;AAAA,IACF;AAEA,SAAK,UAAU;AACf,SAAK,QAAQA;AAAA,EACf;AAAA,EAEA,SAAS,OAAgB,SAA4C;AACnE,qBAAiB,MAAM,QAAQ,KAAK,GAAG,yBAAyB;AAGhE,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,YAAM,OAAO,MAAM;AACnB,uBAAiB,SAAS,GAAG,SAAS,IAAI,WAAW,SAAS,IAAI,KAAK,GAAG,yBAAyB;AACnG,aAAO;AAAA,IACT;AAGA,UAAM,QAAQ,IAAI,MAAM,MAAM,MAAM;AACpC,QAAI,SAAS;AACb,QAAI,WAAW;AACf,QAAI,EAAE,QAAQ,UAAU,IAAI,KAAK,QAAQ,MAAM;AAE/C,WAAQ,SAAS,KAAK,QAAQ,UAAY,WAAW,MAAM,QAAS;AAClE,UAAI;AACF,cAAM,QAAQ,IAAI,UAAU,SAAS,MAAM,QAAQ,GAAG,OAAO;AAC7D,YAAI;AAAQ,WAAC,EAAE,QAAQ,UAAU,IAAI,KAAK,QAAQ,EAAG,MAAM,KAAK,CAAC;AACjE;AAAA,MACF,SAAS,OAAO;AACd,YAAI;AAAQ,gBAAM,IAAI,gBAAgB,OAAO,CAAE,QAAS,CAAC;AAAA;AACpD,WAAC,EAAE,QAAQ,UAAU,IAAI,KAAK,QAAQ,EAAG,MAAM,KAAK,CAAC;AAAA,MAC5D;AAAA,IACF;AAEA,WAAQ,SAAS,KAAK,QAAQ,UAAY,KAAK,QAAQ,MAAM,EAAE,WAAW,OAAQ;AAChF;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,QAAQ,SAAS;AACtC,QAAK,YAAY,KAAM,QAAQ;AAC7B,YAAM,IAAI,gBAAgB,oCAAoC;AAAA,IAChE,WAAW,UAAU,GAAG;AACtB,YAAM,IAAI,gBAAgB,iBAAiB,OAAO,sBAAsB;AAAA,IAC1E;AAEA,UAAM,QAAQ,MAAM,SAAS;AAC7B,qBAAiB,UAAU,GAAG,SAAS,KAAK,iBAAiB,UAAU,IAAI,KAAK,GAAG,WAAW;AAE9F,WAAO;AAAA,EACT;AACF;AAGO,SAAS,MAIdA,QAAwD;AACxD,SAAO,IAAI,eAAeA,MAAK;AACjC;AAGA,SAAS,IAAI,SAAS,cAAc;",
|
|
5
5
|
"names": ["tuple"]
|
|
6
6
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/validators/union.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAqD;AACrD,mBAAkC;AAClC,uBAA6B;
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAqD;AACrD,mBAAkC;AAClC,uBAA6B;AAyCtB,IAAM,iBAAN,cACG,+BAA+D;AAAA,EAC9D;AAAA,EAET,YAAY,MAAS;AACnB,UAAM;AACN,SAAK,aAAa,KAAK,IAAI,CAAC,mBAAe,+BAAa,UAAU,CAAC;AACnE,oCAAa,KAAK,WAAW,SAAS,GAAG,6CAA6C;AAAA,EACxF;AAAA,EAEA,SAAS,OAAgB,SAAsD;AAC7E,UAAM,UAAU,IAAI,qCAAuB;AAC3C,eAAW,aAAa,KAAK,YAAY;AACvC,UAAI;AACF,eAAO,UAAU,SAAS,OAAO,OAAO;AAAA,MAC1C,SAAS,OAAO;AACd,gBAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,IACF;AACA,WAAO,QAAQ,OAAO,KAAgC;AAAA,EACxD;AACF;AAGO,SAAS,SAAmC,MAA4B;AAC7E,SAAO,IAAI,eAAe,IAAI;AAChC;AAyBO,IAAM,iBAAN,cACG,+BAA+D;AAAA,EAC9D;AAAA,EAET,YAAY,MAAS;AACnB,UAAM;AACN,SAAK,aAAa,KAAK,IAAI,CAAC,mBAAe,+BAAa,UAAU,CAAC;AACnE,oCAAa,KAAK,WAAW,SAAS,GAAG,6CAA6C;AAAA,EACxF;AAAA,EAEA,SAAS,OAAgB,SAAsD;AAC7E,eAAW,aAAa,KAAK,YAAY;AACvC,cAAQ,UAAU,SAAS,OAAO,OAAO;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AACF;AAGO,SAAS,SAAmC,MAA4B;AAC7E,SAAO,IAAI,eAAe,IAAI;AAChC;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
import { AbstractValidator } from '../types';
|
|
2
|
-
import type { InferValidation, Validation, ValidationOptions, Validator } from '../types';
|
|
2
|
+
import type { InferInput, InferValidation, Validation, ValidationOptions, Validator } from '../types';
|
|
3
3
|
export type OneOfArguments = readonly Validation[];
|
|
4
|
-
export type
|
|
4
|
+
export type InferOneOfValidation<A extends OneOfArguments> = A extends readonly [infer First, ...infer Rest] ? First extends Validation ? Rest extends OneOfArguments ? InferValidation<First> | InferOneOfValidation<Rest> : InferValidation<First> : never : A extends readonly (infer Type)[] ? Type extends Validation ? InferValidation<Type> : never : never;
|
|
5
|
+
export type InferOneOfInput<A extends OneOfArguments> = A extends readonly [infer First, ...infer Rest] ? First extends Validation ? Rest extends OneOfArguments ? InferInput<First> | InferOneOfValidation<Rest> : InferInput<First> : never : A extends readonly (infer Type)[] ? Type extends Validation ? InferInput<Type> : never : never;
|
|
5
6
|
/** A `Validator` validating a value as _one of_ the specified arguments. */
|
|
6
|
-
export declare class OneOfValidator<A extends OneOfArguments> extends AbstractValidator<
|
|
7
|
+
export declare class OneOfValidator<A extends OneOfArguments> extends AbstractValidator<InferOneOfValidation<A>, InferOneOfInput<A>> {
|
|
7
8
|
readonly validators: readonly Validator[];
|
|
8
9
|
constructor(args: A);
|
|
9
|
-
validate(value: unknown, options?: ValidationOptions):
|
|
10
|
+
validate(value: unknown, options?: ValidationOptions): InferOneOfValidation<A>;
|
|
10
11
|
}
|
|
11
12
|
/** Validate a value as _one of_ the specified arguments */
|
|
12
13
|
export declare function oneOf<A extends OneOfArguments>(...args: A): OneOfValidator<A>;
|
|
13
14
|
export type AllOfArguments = readonly [Validation, ...Validation[]];
|
|
14
|
-
export type
|
|
15
|
+
export type InferAllOfValidation<A extends AllOfArguments> = A extends readonly [infer First, ...infer Rest] ? First extends Validation ? Rest extends AllOfArguments ? InferValidation<First> & InferAllOfValidation<Rest> : InferValidation<First> : never : never;
|
|
16
|
+
export type InferAllOfInput<A extends AllOfArguments> = A extends readonly [infer First, ...infer Rest] ? First extends Validation ? Rest extends AllOfArguments ? InferInput<First> & InferAllOfValidation<Rest> : InferInput<First> : never : never;
|
|
15
17
|
/** A `Validator` validating a value as _all of_ the specified arguments. */
|
|
16
|
-
export declare class AllOfValidator<A extends AllOfArguments> extends AbstractValidator<
|
|
18
|
+
export declare class AllOfValidator<A extends AllOfArguments> extends AbstractValidator<InferAllOfValidation<A>, InferAllOfInput<A>> {
|
|
17
19
|
readonly validators: readonly Validator[];
|
|
18
20
|
constructor(args: A);
|
|
19
|
-
validate(value: unknown, options?: ValidationOptions):
|
|
21
|
+
validate(value: unknown, options?: ValidationOptions): InferAllOfValidation<A>;
|
|
20
22
|
}
|
|
21
23
|
/** Validate a value as _all of_ the specified arguments */
|
|
22
24
|
export declare function allOf<A extends AllOfArguments>(...args: A): AllOfValidator<A>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/validators/union.ts"],
|
|
4
|
-
"mappings": ";AAAA,SAAS,cAAc,8BAA8B;AACrD,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;
|
|
4
|
+
"mappings": ";AAAA,SAAS,cAAc,8BAA8B;AACrD,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAyCtB,IAAM,iBAAN,cACG,kBAA+D;AAAA,EAC9D;AAAA,EAET,YAAY,MAAS;AACnB,UAAM;AACN,SAAK,aAAa,KAAK,IAAI,CAAC,eAAe,aAAa,UAAU,CAAC;AACnE,iBAAa,KAAK,WAAW,SAAS,GAAG,6CAA6C;AAAA,EACxF;AAAA,EAEA,SAAS,OAAgB,SAAsD;AAC7E,UAAM,UAAU,IAAI,uBAAuB;AAC3C,eAAW,aAAa,KAAK,YAAY;AACvC,UAAI;AACF,eAAO,UAAU,SAAS,OAAO,OAAO;AAAA,MAC1C,SAAS,OAAO;AACd,gBAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,IACF;AACA,WAAO,QAAQ,OAAO,KAAgC;AAAA,EACxD;AACF;AAGO,SAAS,SAAmC,MAA4B;AAC7E,SAAO,IAAI,eAAe,IAAI;AAChC;AAyBO,IAAM,iBAAN,cACG,kBAA+D;AAAA,EAC9D;AAAA,EAET,YAAY,MAAS;AACnB,UAAM;AACN,SAAK,aAAa,KAAK,IAAI,CAAC,eAAe,aAAa,UAAU,CAAC;AACnE,iBAAa,KAAK,WAAW,SAAS,GAAG,6CAA6C;AAAA,EACxF;AAAA,EAEA,SAAS,OAAgB,SAAsD;AAC7E,eAAW,aAAa,KAAK,YAAY;AACvC,cAAQ,UAAU,SAAS,OAAO,OAAO;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AACF;AAGO,SAAS,SAAmC,MAA4B;AAC7E,SAAO,IAAI,eAAe,IAAI;AAChC;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "justus",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "A JavaScript validation library, with types!",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -24,6 +24,46 @@
|
|
|
24
24
|
"types": "./dist/dts-generator.d.ts",
|
|
25
25
|
"default": "./dist/dts-generator.mjs"
|
|
26
26
|
}
|
|
27
|
+
},
|
|
28
|
+
"./extra/arn": {
|
|
29
|
+
"require": {
|
|
30
|
+
"types": "./dist/extra/arn.d.ts",
|
|
31
|
+
"default": "./dist/extra/arn.cjs"
|
|
32
|
+
},
|
|
33
|
+
"import": {
|
|
34
|
+
"types": "./dist/extra/arn.d.ts",
|
|
35
|
+
"default": "./dist/extra/arn.mjs"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"./extra/ean13": {
|
|
39
|
+
"require": {
|
|
40
|
+
"types": "./dist/extra/ean13.d.ts",
|
|
41
|
+
"default": "./dist/extra/ean13.cjs"
|
|
42
|
+
},
|
|
43
|
+
"import": {
|
|
44
|
+
"types": "./dist/extra/ean13.d.ts",
|
|
45
|
+
"default": "./dist/extra/ean13.mjs"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"./extra/url": {
|
|
49
|
+
"require": {
|
|
50
|
+
"types": "./dist/extra/url.d.ts",
|
|
51
|
+
"default": "./dist/extra/url.cjs"
|
|
52
|
+
},
|
|
53
|
+
"import": {
|
|
54
|
+
"types": "./dist/extra/url.d.ts",
|
|
55
|
+
"default": "./dist/extra/url.mjs"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"./extra/uuid": {
|
|
59
|
+
"require": {
|
|
60
|
+
"types": "./dist/extra/uuid.d.ts",
|
|
61
|
+
"default": "./dist/extra/uuid.cjs"
|
|
62
|
+
},
|
|
63
|
+
"import": {
|
|
64
|
+
"types": "./dist/extra/uuid.d.ts",
|
|
65
|
+
"default": "./dist/extra/uuid.mjs"
|
|
66
|
+
}
|
|
27
67
|
}
|
|
28
68
|
},
|
|
29
69
|
"types": "./dist/index.d.ts",
|
|
@@ -38,14 +78,14 @@
|
|
|
38
78
|
"author": "Juit Developers <developers@juit.com>",
|
|
39
79
|
"license": "Apache-2.0",
|
|
40
80
|
"devDependencies": {
|
|
41
|
-
"@plugjs/build": "^0.4.
|
|
42
|
-
"@plugjs/tsd": "^0.4.
|
|
81
|
+
"@plugjs/build": "^0.4.30",
|
|
82
|
+
"@plugjs/tsd": "^0.4.31",
|
|
43
83
|
"@types/chai": "^4.3.5",
|
|
44
|
-
"chai": "^4.3.
|
|
45
|
-
"typescript": "^5.
|
|
84
|
+
"chai": "^4.3.8",
|
|
85
|
+
"typescript": "^5.2.2"
|
|
46
86
|
},
|
|
47
87
|
"optionalDependencies": {
|
|
48
|
-
"typescript": "^5.
|
|
88
|
+
"typescript": "^5.2.2"
|
|
49
89
|
},
|
|
50
90
|
"directories": {
|
|
51
91
|
"test": "test"
|
package/src/dts-generator.ts
CHANGED
|
@@ -1,32 +1,22 @@
|
|
|
1
1
|
import ts from 'typescript'
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
OptionalValidator,
|
|
21
|
-
StringValidator,
|
|
22
|
-
TupleValidator,
|
|
23
|
-
URLValidator,
|
|
24
|
-
} from './index'
|
|
25
|
-
|
|
26
|
-
import type {
|
|
27
|
-
Validation,
|
|
28
|
-
Validator,
|
|
29
|
-
} from './index'
|
|
3
|
+
import { assertSchema } from './errors'
|
|
4
|
+
import { URLValidator } from './extra/url'
|
|
5
|
+
import { getValidator } from './utilities'
|
|
6
|
+
import { AnyValidator } from './validators/any'
|
|
7
|
+
import { AnyArrayValidator, ArrayValidator } from './validators/array'
|
|
8
|
+
import { BooleanValidator } from './validators/boolean'
|
|
9
|
+
import { ConstantValidator } from './validators/constant'
|
|
10
|
+
import { DateValidator } from './validators/date'
|
|
11
|
+
import { NeverValidator } from './validators/never'
|
|
12
|
+
import { AnyNumberValidator, NumberValidator } from './validators/number'
|
|
13
|
+
import { AnyObjectValidator, ObjectValidator } from './validators/object'
|
|
14
|
+
import { OptionalValidator } from './validators/optional'
|
|
15
|
+
import { AnyStringValidator, StringValidator } from './validators/string'
|
|
16
|
+
import { TupleValidator } from './validators/tuple'
|
|
17
|
+
import { AllOfValidator, OneOfValidator } from './validators/union'
|
|
18
|
+
|
|
19
|
+
import type { Validation, Validator } from './types'
|
|
30
20
|
|
|
31
21
|
/* ========================================================================== *
|
|
32
22
|
* LOCAL TYPES *
|
package/src/extra/arn.ts
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { assertValidation } from '../errors'
|
|
2
|
+
import { AbstractValidator, makeValidatorFactory } from '../types'
|
|
3
|
+
|
|
4
|
+
/** The type for a validated _string_ ARN (Amazon Resource Name) */
|
|
5
|
+
export type ArnString<Service extends string = string> = string & { __arn: never }
|
|
6
|
+
& ( string extends Service ? string : { [ k in `__arn_${Service}`] : never })
|
|
7
|
+
|
|
8
|
+
/** The type for a _parsed_ ARN (Amazon Resource Name) */
|
|
9
|
+
export interface ParsedArn<Service extends string = string> {
|
|
10
|
+
/** The full */
|
|
11
|
+
Arn: ArnString<Service>,
|
|
12
|
+
Partition: string,
|
|
13
|
+
Service: Service,
|
|
14
|
+
Region: string,
|
|
15
|
+
Account: string,
|
|
16
|
+
Resource: [ string, ...string[] ],
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* ========================================================================== */
|
|
20
|
+
|
|
21
|
+
/** Validate a string and convert it into into an {@link ParsedArn} */
|
|
22
|
+
function parse<Service extends string>(
|
|
23
|
+
value: unknown,
|
|
24
|
+
service?: Service,
|
|
25
|
+
type?: string,
|
|
26
|
+
): ParsedArn<Service> {
|
|
27
|
+
assertValidation(typeof value == 'string', 'Value is not a "string"')
|
|
28
|
+
|
|
29
|
+
const segments = value.split(':')
|
|
30
|
+
|
|
31
|
+
assertValidation(segments.length >= 6, 'Invalid components in ARN')
|
|
32
|
+
|
|
33
|
+
const [ pfx, prt, svc, rgn, act, ...res ] = segments
|
|
34
|
+
|
|
35
|
+
assertValidation(pfx === 'arn', 'ARN must start with "arn:"')
|
|
36
|
+
assertValidation(!! prt, 'Missing partition in ARN')
|
|
37
|
+
assertValidation(!! svc, 'Missing service in ARN')
|
|
38
|
+
assertValidation(!! act, 'Missing account ID in ARN')
|
|
39
|
+
assertValidation(!! res[0], 'Missing resource ID in ARN')
|
|
40
|
+
|
|
41
|
+
if (service !== undefined) {
|
|
42
|
+
assertValidation(svc === service, `ARN Service "${svc}" mismatch (expected "${service}")`)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const [ resArray, resString ] = res[0].includes('/') ?
|
|
46
|
+
[ res[0].split('/'), res[0] ] :
|
|
47
|
+
[ res, res.join(':') ]
|
|
48
|
+
|
|
49
|
+
assertValidation(!! resArray[0], 'Invalid resource ID in ARN')
|
|
50
|
+
|
|
51
|
+
if (type !== undefined) {
|
|
52
|
+
assertValidation(resArray[0] === type, `ARN Resource Type "${resArray[0]}" mismatch (expected "${type}")`)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const arn = `arn:${prt}:${svc}:${rgn}:${act}:${resString}`
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
Arn: arn as ArnString<Service>,
|
|
59
|
+
Partition: prt,
|
|
60
|
+
Service: svc as Service,
|
|
61
|
+
Region: rgn || '',
|
|
62
|
+
Account: act,
|
|
63
|
+
Resource: resArray as [ string, ...string[] ],
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* ========================================================================== */
|
|
68
|
+
|
|
69
|
+
/** Validator parsing an ARN (Amazon Resource Name) and returning its components */
|
|
70
|
+
export class ParsedArnValidator<Service extends string = string>
|
|
71
|
+
extends AbstractValidator<ParsedArn<Service>, string> {
|
|
72
|
+
/**
|
|
73
|
+
* Create a new {@link ParsedArnValidator} instance.
|
|
74
|
+
*
|
|
75
|
+
* @param service The (optional) service the ARN should be pointing to
|
|
76
|
+
* (e.g. `iam` or `elasticloadbalancing`)
|
|
77
|
+
* @param resourceType The (optional) resource _type_ the ARN should be
|
|
78
|
+
* representing (e.g. `role` in the `iam` service, or
|
|
79
|
+
* `targetgroup` in the `elasticloadbalancing` service)
|
|
80
|
+
*/
|
|
81
|
+
constructor(service?: Service, resourceType?: string)
|
|
82
|
+
constructor(private _service?: Service, private _type?: string) {
|
|
83
|
+
super()
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
validate(value: unknown): ParsedArn<Service> {
|
|
87
|
+
return parse(value, this._service, this._type)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Validator validating an ARN (Amazon Resource Name) _string_ */
|
|
92
|
+
export class ArnValidator<Service extends string = string>
|
|
93
|
+
extends AbstractValidator<ArnString<Service>, string> {
|
|
94
|
+
/**
|
|
95
|
+
* Create a new {@link ArnValidator} instance.
|
|
96
|
+
*
|
|
97
|
+
* @param service The (optional) service the ARN should be pointing to
|
|
98
|
+
* (e.g. `iam` or `elasticloadbalancing`)
|
|
99
|
+
* @param resourceType The (optional) resource _type_ the ARN should be
|
|
100
|
+
* representing (e.g. `role` in the `iam` service, or
|
|
101
|
+
* `targetgroup` in the `elasticloadbalancing` service)
|
|
102
|
+
*/
|
|
103
|
+
constructor(service?: Service, resourceType?: string)
|
|
104
|
+
constructor(private _service?: Service, private _type?: string) {
|
|
105
|
+
super()
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
validate(value: unknown): ArnString<Service> {
|
|
109
|
+
return parse(value, this._service, this._type).Arn
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* ========================================================================== */
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Create a new {@link ParsedArnValidator} parsing an ARN referring to the
|
|
117
|
+
* specified `service` (e.g. `iam` or `elasticloadbalancing`).
|
|
118
|
+
*
|
|
119
|
+
* An (optional) resource _type_ can be specified, and will validate the first
|
|
120
|
+
* component of the ARN's resource (e.g. `role` in the `iam` service, or
|
|
121
|
+
* `targetgroup` in the `elasticloadbalancing` service)
|
|
122
|
+
*/
|
|
123
|
+
export function parseArnFactory<Service extends string = string>(
|
|
124
|
+
service: Service,
|
|
125
|
+
resourceType?: string,
|
|
126
|
+
): ParsedArnValidator<Service> {
|
|
127
|
+
return new ParsedArnValidator(service, resourceType)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Create a new {@link ArnValidator} validating an ARN referring to the
|
|
132
|
+
* specified `service` (e.g. `iam` or `elasticloadbalancing`).
|
|
133
|
+
*
|
|
134
|
+
* An (optional) resource _type_ can be specified, and will validate the first
|
|
135
|
+
* component of the ARN's resource (e.g. `role` in the `iam` service, or
|
|
136
|
+
* `targetgroup` in the `elasticloadbalancing` service)
|
|
137
|
+
*/
|
|
138
|
+
export function arnFactory<Service extends string = string>(
|
|
139
|
+
service: Service,
|
|
140
|
+
resourceType?: string,
|
|
141
|
+
): ArnValidator<Service> {
|
|
142
|
+
return new ArnValidator(service, resourceType)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* ========================================================================== */
|
|
146
|
+
|
|
147
|
+
/** Validate a string and parse it into into an {@link ParsedArn} */
|
|
148
|
+
export const parseArn = makeValidatorFactory(new ParsedArnValidator(), parseArnFactory)
|
|
149
|
+
|
|
150
|
+
/** Validate a ARN (Amazon Resource Name) string */
|
|
151
|
+
export const arn = makeValidatorFactory(new ArnValidator(), arnFactory)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { assertValidation } from '../errors'
|
|
2
|
+
import { StringValidator } from '../validators/string'
|
|
3
|
+
|
|
4
|
+
export type EAN13String = string & { __ean_13: never }
|
|
5
|
+
|
|
6
|
+
export class EAN13Validator extends StringValidator<EAN13String, string | number> {
|
|
7
|
+
constructor() {
|
|
8
|
+
super({ minLength: 13, maxLength: 13, pattern: /^\d{13}$/ })
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
validate(value: unknown): EAN13String
|
|
12
|
+
validate(value: unknown): string {
|
|
13
|
+
if (typeof value === 'number') value = `${value}`
|
|
14
|
+
const ean13 = super.validate(value).toLowerCase()
|
|
15
|
+
|
|
16
|
+
/* Calculate the weighted sum for the first 12 digits */
|
|
17
|
+
let sum = 0
|
|
18
|
+
for (let i = 0, w = 1; i < 12; i ++, w = i % 2 ? 3 : 1) {
|
|
19
|
+
sum += (ean13.charCodeAt(i) - 0x30) * w
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* 10 - sum should match our 13th digit */
|
|
23
|
+
const valid = (10 - (sum % 10)) % 10 === ean13.charCodeAt(12) - 0x30
|
|
24
|
+
|
|
25
|
+
/* Assert validity of the checksum and return */
|
|
26
|
+
assertValidation(valid, `Invalid checksum in EAN-13 "${ean13}"`)
|
|
27
|
+
return ean13
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const ean13 = new EAN13Validator()
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ValidationError, ValidationErrorBuilder } from '../errors'
|
|
2
2
|
import { AbstractValidator, makeValidatorFactory } from '../types'
|
|
3
|
-
import { ConstantValidator } from '
|
|
4
|
-
import { ObjectValidator } from '
|
|
3
|
+
import { ConstantValidator } from '../validators/constant'
|
|
4
|
+
import { ObjectValidator } from '../validators/object'
|
|
5
5
|
|
|
6
6
|
import type { ValidationOptions } from '..'
|
|
7
7
|
import type { Schema, Validator } from '../types'
|
|
@@ -60,7 +60,7 @@ export interface URLConstraints {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
/** A `Validator` validating URLs and converting them to `URL` instances. */
|
|
63
|
-
export class URLValidator extends AbstractValidator<URL> {
|
|
63
|
+
export class URLValidator extends AbstractValidator<URL, URL | string> {
|
|
64
64
|
readonly href?: Validator<string>
|
|
65
65
|
readonly origin?: Validator<string>
|
|
66
66
|
readonly protocol?: Validator<string>
|
|
@@ -115,9 +115,7 @@ export class URLValidator extends AbstractValidator<URL> {
|
|
|
115
115
|
|
|
116
116
|
if (this.searchParams) {
|
|
117
117
|
const parameters: Record<string, string> = {}
|
|
118
|
-
|
|
119
|
-
parameters[param] = url.searchParams.get(param) as string
|
|
120
|
-
}
|
|
118
|
+
url.searchParams.forEach((value, key) => parameters[key] = value)
|
|
121
119
|
|
|
122
120
|
try {
|
|
123
121
|
this.searchParams.validate(parameters, OPTIONS)
|
|
@@ -130,9 +128,9 @@ export class URLValidator extends AbstractValidator<URL> {
|
|
|
130
128
|
}
|
|
131
129
|
}
|
|
132
130
|
|
|
133
|
-
function
|
|
131
|
+
export function urlFactory(constraints: URLConstraints): URLValidator {
|
|
134
132
|
return new URLValidator(constraints)
|
|
135
133
|
}
|
|
136
134
|
|
|
137
135
|
/** Validate URLs and convert them to `URL` instances. */
|
|
138
|
-
export const url = makeValidatorFactory(new URLValidator(),
|
|
136
|
+
export const url = makeValidatorFactory(new URLValidator(), urlFactory)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { StringValidator } from '../validators/string'
|
|
2
|
+
|
|
3
|
+
export const UUID_EXPR = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
|
|
4
|
+
|
|
5
|
+
export type UUIDString = string & { __uuid: never }
|
|
6
|
+
|
|
7
|
+
export class UUIDValidator extends StringValidator<UUIDString> {
|
|
8
|
+
constructor() {
|
|
9
|
+
super({ minLength: 36, maxLength: 36, pattern: UUID_EXPR })
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
validate(value: unknown): UUIDString
|
|
13
|
+
validate(value: unknown): string {
|
|
14
|
+
return super.validate(value).toLowerCase()
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const uuid = new UUIDValidator()
|
package/src/index.ts
CHANGED
|
@@ -9,28 +9,27 @@ export * from './types'
|
|
|
9
9
|
export * from './utilities'
|
|
10
10
|
|
|
11
11
|
// Validators
|
|
12
|
-
export {
|
|
13
|
-
export {
|
|
14
|
-
export {
|
|
15
|
-
export {
|
|
16
|
-
export {
|
|
17
|
-
export {
|
|
18
|
-
export { AnyNumberValidator,
|
|
19
|
-
export { AnyObjectValidator, object, objectOf
|
|
20
|
-
export {
|
|
21
|
-
export { AnyStringValidator,
|
|
22
|
-
export {
|
|
23
|
-
export {
|
|
24
|
-
export { url, URLValidator } from './validators/url'
|
|
12
|
+
export { AnyValidator, any } from './validators/any'
|
|
13
|
+
export { AnyArrayValidator, ArrayValidator, array, arrayOf } from './validators/array'
|
|
14
|
+
export { BooleanValidator, boolean } from './validators/boolean'
|
|
15
|
+
export { ConstantValidator, constant } from './validators/constant'
|
|
16
|
+
export { DateValidator, date } from './validators/date'
|
|
17
|
+
export { NeverValidator, never } from './validators/never'
|
|
18
|
+
export { AnyNumberValidator, NumberValidator, number } from './validators/number'
|
|
19
|
+
export { AnyObjectValidator, ObjectValidator, object, objectOf } from './validators/object'
|
|
20
|
+
export { OptionalValidator, optional } from './validators/optional'
|
|
21
|
+
export { AnyStringValidator, StringValidator, string } from './validators/string'
|
|
22
|
+
export { TupleValidator, tuple } from './validators/tuple'
|
|
23
|
+
export { AllOfValidator, OneOfValidator, allOf, oneOf } from './validators/union'
|
|
25
24
|
|
|
26
25
|
// Validator Types
|
|
27
|
-
export type { ArrayConstraints } from './validators/array'
|
|
28
|
-
export type { BooleanConstraints } from './validators/boolean'
|
|
29
|
-
export type { DateConstraints } from './validators/date'
|
|
30
|
-
export type { BrandedNumberConstraints } from './validators/number'
|
|
31
|
-
export type {
|
|
26
|
+
export type { ArrayConstraints, arrayFactory } from './validators/array'
|
|
27
|
+
export type { BooleanConstraints, booleanFactory } from './validators/boolean'
|
|
28
|
+
export type { DateConstraints, dateFactory } from './validators/date'
|
|
29
|
+
export type { BrandedNumberConstraints, numberFactory } from './validators/number'
|
|
30
|
+
export type { objectFactory } from './validators/object'
|
|
31
|
+
export type { BrandedStringConstraints, StringConstraints, stringFactory } from './validators/string'
|
|
32
32
|
export type { TupleMember } from './validators/tuple'
|
|
33
|
-
export type { URLConstraints } from './validators/url'
|
|
34
33
|
|
|
35
34
|
/* ========================================================================== *
|
|
36
35
|
* VALIDATE FUNCTION (our main entry point) *
|
package/src/registry.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { assertSchema } from './errors'
|
|
2
|
+
|
|
3
|
+
import type { ConstantValidator } from './validators/constant'
|
|
4
|
+
import type { ObjectValidator } from './validators/object'
|
|
5
|
+
import type { TupleValidator } from './validators/tuple'
|
|
6
|
+
|
|
7
|
+
type RegistryTypes = {
|
|
8
|
+
constant: typeof ConstantValidator,
|
|
9
|
+
object: typeof ObjectValidator,
|
|
10
|
+
tuple: typeof TupleValidator,
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const _registry: Partial<RegistryTypes> = {}
|
|
14
|
+
|
|
15
|
+
/** Internal registry for validator constructors (avoids circular imports) */
|
|
16
|
+
export const registry = {
|
|
17
|
+
/** Registers the specified validator constructor */
|
|
18
|
+
set<K extends keyof RegistryTypes>(key: K, constructor: RegistryTypes[K]): void {
|
|
19
|
+
_registry[key] = constructor
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
/** Retrieves the specified validator constructor */
|
|
23
|
+
get<K extends keyof RegistryTypes>(key: K): RegistryTypes[K] {
|
|
24
|
+
const value = _registry[key]
|
|
25
|
+
assertSchema(!! value, `No validator found for "${key}"`)
|
|
26
|
+
return value
|
|
27
|
+
},
|
|
28
|
+
}
|
package/src/schema.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
// import { additionalValidator } from './types'
|
|
2
|
-
// eslint-disable-next-line import/no-cycle
|
|
3
1
|
import { getValidator } from './utilities'
|
|
4
2
|
import { any } from './validators/any'
|
|
5
3
|
|
|
6
4
|
import type {
|
|
7
|
-
AdditionalProperties,
|
|
5
|
+
AdditionalProperties,
|
|
6
|
+
InferValidation,
|
|
8
7
|
Validation,
|
|
9
8
|
Validator,
|
|
10
9
|
} from './types'
|
|
@@ -14,12 +13,12 @@ import type {
|
|
|
14
13
|
* ========================================================================== */
|
|
15
14
|
|
|
16
15
|
/** Internal definition of `allowAdditionalProperties(...)` */
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
function additionalProperties(): AdditionalProperties<Validator<any>>
|
|
17
|
+
function additionalProperties(allow: true): AdditionalProperties<Validator<any>>
|
|
18
|
+
function additionalProperties(allow: false): AdditionalProperties<false>
|
|
19
|
+
function additionalProperties<V extends Validation>(validation: V): AdditionalProperties<Validator<InferValidation<V>>>
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
function additionalProperties(options?: Validation | boolean): AdditionalProperties<Validator | false> {
|
|
23
22
|
if (options === false) return { [Symbol.justusAdditionalValidator]: false }
|
|
24
23
|
if (options === true) return { [Symbol.justusAdditionalValidator]: any }
|
|
25
24
|
|
|
@@ -35,9 +34,9 @@ export function _allowAdditionalProperties(options?: Validation | boolean): Addi
|
|
|
35
34
|
*
|
|
36
35
|
* @param allow - A `boolean` or a `Validator` instance
|
|
37
36
|
*/
|
|
38
|
-
export const allowAdditionalProperties =
|
|
39
|
-
typeof
|
|
37
|
+
export const allowAdditionalProperties = additionalProperties as
|
|
38
|
+
typeof additionalProperties & AdditionalProperties<Validator<any>>
|
|
40
39
|
|
|
41
40
|
// Remember to inject our `any` validator as the default for when
|
|
42
41
|
// `allowAdditionalProperties` is _not_ used as a function
|
|
43
|
-
|
|
42
|
+
additionalProperties[Symbol.justusAdditionalValidator] = any
|