typesea 0.1.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 +9 -0
- package/LICENSE +21 -0
- package/README.md +320 -0
- package/dist/adapters/index.d.ts +152 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +396 -0
- package/dist/aot/index.d.ts +33 -0
- package/dist/aot/index.d.ts.map +1 -0
- package/dist/aot/index.js +295 -0
- package/dist/async/index.d.ts +111 -0
- package/dist/async/index.d.ts.map +1 -0
- package/dist/async/index.js +221 -0
- package/dist/builders/composite.d.ts +31 -0
- package/dist/builders/composite.d.ts.map +1 -0
- package/dist/builders/composite.js +165 -0
- package/dist/builders/index.d.ts +11 -0
- package/dist/builders/index.d.ts.map +1 -0
- package/dist/builders/index.js +9 -0
- package/dist/builders/modifier.d.ts +26 -0
- package/dist/builders/modifier.d.ts.map +1 -0
- package/dist/builders/modifier.js +67 -0
- package/dist/builders/object/guard.d.ts +62 -0
- package/dist/builders/object/guard.d.ts.map +1 -0
- package/dist/builders/object/guard.js +113 -0
- package/dist/builders/object/index.d.ts +7 -0
- package/dist/builders/object/index.d.ts.map +1 -0
- package/dist/builders/object/index.js +5 -0
- package/dist/builders/object/schema.d.ts +44 -0
- package/dist/builders/object/schema.d.ts.map +1 -0
- package/dist/builders/object/schema.js +257 -0
- package/dist/builders/object/types.d.ts +63 -0
- package/dist/builders/object/types.d.ts.map +1 -0
- package/dist/builders/object/types.js +5 -0
- package/dist/builders/scalar.d.ts +39 -0
- package/dist/builders/scalar.d.ts.map +1 -0
- package/dist/builders/scalar.js +63 -0
- package/dist/builders/table.d.ts +53 -0
- package/dist/builders/table.d.ts.map +1 -0
- package/dist/builders/table.js +48 -0
- package/dist/builders/types.d.ts +26 -0
- package/dist/builders/types.d.ts.map +1 -0
- package/dist/builders/types.js +5 -0
- package/dist/compile/check-composite.d.ts +34 -0
- package/dist/compile/check-composite.d.ts.map +1 -0
- package/dist/compile/check-composite.js +117 -0
- package/dist/compile/check-scalar.d.ts +24 -0
- package/dist/compile/check-scalar.d.ts.map +1 -0
- package/dist/compile/check-scalar.js +73 -0
- package/dist/compile/check.d.ts +15 -0
- package/dist/compile/check.d.ts.map +1 -0
- package/dist/compile/check.js +98 -0
- package/dist/compile/context.d.ts +35 -0
- package/dist/compile/context.d.ts.map +1 -0
- package/dist/compile/context.js +72 -0
- package/dist/compile/graph-predicate.d.ts +19 -0
- package/dist/compile/graph-predicate.d.ts.map +1 -0
- package/dist/compile/graph-predicate.js +460 -0
- package/dist/compile/guard.d.ts +41 -0
- package/dist/compile/guard.d.ts.map +1 -0
- package/dist/compile/guard.js +180 -0
- package/dist/compile/index.d.ts +8 -0
- package/dist/compile/index.d.ts.map +1 -0
- package/dist/compile/index.js +6 -0
- package/dist/compile/issue.d.ts +18 -0
- package/dist/compile/issue.d.ts.map +1 -0
- package/dist/compile/issue.js +28 -0
- package/dist/compile/names.d.ts +16 -0
- package/dist/compile/names.d.ts.map +1 -0
- package/dist/compile/names.js +82 -0
- package/dist/compile/predicate.d.ts +23 -0
- package/dist/compile/predicate.d.ts.map +1 -0
- package/dist/compile/predicate.js +317 -0
- package/dist/compile/runtime.d.ts +55 -0
- package/dist/compile/runtime.d.ts.map +1 -0
- package/dist/compile/runtime.js +63 -0
- package/dist/compile/source.d.ts +11 -0
- package/dist/compile/source.d.ts.map +1 -0
- package/dist/compile/source.js +51 -0
- package/dist/compile/types.d.ts +52 -0
- package/dist/compile/types.d.ts.map +1 -0
- package/dist/compile/types.js +5 -0
- package/dist/decoder/index.d.ts +106 -0
- package/dist/decoder/index.d.ts.map +1 -0
- package/dist/decoder/index.js +262 -0
- package/dist/evaluate/check-composite.d.ts +39 -0
- package/dist/evaluate/check-composite.d.ts.map +1 -0
- package/dist/evaluate/check-composite.js +184 -0
- package/dist/evaluate/check-scalar.d.ts +20 -0
- package/dist/evaluate/check-scalar.d.ts.map +1 -0
- package/dist/evaluate/check-scalar.js +81 -0
- package/dist/evaluate/check.d.ts +11 -0
- package/dist/evaluate/check.d.ts.map +1 -0
- package/dist/evaluate/check.js +126 -0
- package/dist/evaluate/index.d.ts +7 -0
- package/dist/evaluate/index.d.ts.map +1 -0
- package/dist/evaluate/index.js +6 -0
- package/dist/evaluate/issue.d.ts +10 -0
- package/dist/evaluate/issue.d.ts.map +1 -0
- package/dist/evaluate/issue.js +11 -0
- package/dist/evaluate/predicate.d.ts +26 -0
- package/dist/evaluate/predicate.d.ts.map +1 -0
- package/dist/evaluate/predicate.js +37 -0
- package/dist/evaluate/shared.d.ts +59 -0
- package/dist/evaluate/shared.d.ts.map +1 -0
- package/dist/evaluate/shared.js +96 -0
- package/dist/evaluate/state.d.ts +65 -0
- package/dist/evaluate/state.d.ts.map +1 -0
- package/dist/evaluate/state.js +66 -0
- package/dist/guard/base.d.ts +72 -0
- package/dist/guard/base.d.ts.map +1 -0
- package/dist/guard/base.js +136 -0
- package/dist/guard/error.d.ts +19 -0
- package/dist/guard/error.d.ts.map +1 -0
- package/dist/guard/error.js +22 -0
- package/dist/guard/index.d.ts +10 -0
- package/dist/guard/index.d.ts.map +1 -0
- package/dist/guard/index.js +8 -0
- package/dist/guard/number.d.ts +32 -0
- package/dist/guard/number.d.ts.map +1 -0
- package/dist/guard/number.js +71 -0
- package/dist/guard/props.d.ts +18 -0
- package/dist/guard/props.d.ts.map +1 -0
- package/dist/guard/props.js +35 -0
- package/dist/guard/read.d.ts +42 -0
- package/dist/guard/read.d.ts.map +1 -0
- package/dist/guard/read.js +114 -0
- package/dist/guard/registry.d.ts +15 -0
- package/dist/guard/registry.d.ts.map +1 -0
- package/dist/guard/registry.js +21 -0
- package/dist/guard/string.d.ts +36 -0
- package/dist/guard/string.d.ts.map +1 -0
- package/dist/guard/string.js +95 -0
- package/dist/guard/types.d.ts +103 -0
- package/dist/guard/types.d.ts.map +1 -0
- package/dist/guard/types.js +5 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/internal/index.d.ts +34 -0
- package/dist/internal/index.d.ts.map +1 -0
- package/dist/internal/index.js +56 -0
- package/dist/ir/builder.d.ts +173 -0
- package/dist/ir/builder.d.ts.map +1 -0
- package/dist/ir/builder.js +481 -0
- package/dist/ir/freeze.d.ts +10 -0
- package/dist/ir/freeze.d.ts.map +1 -0
- package/dist/ir/freeze.js +102 -0
- package/dist/ir/index.d.ts +9 -0
- package/dist/ir/index.d.ts.map +1 -0
- package/dist/ir/index.js +7 -0
- package/dist/ir/regexp.d.ts +6 -0
- package/dist/ir/regexp.d.ts.map +1 -0
- package/dist/ir/regexp.js +12 -0
- package/dist/ir/types.d.ts +215 -0
- package/dist/ir/types.d.ts.map +1 -0
- package/dist/ir/types.js +5 -0
- package/dist/ir/validate.d.ts +10 -0
- package/dist/ir/validate.d.ts.map +1 -0
- package/dist/ir/validate.js +271 -0
- package/dist/issue/index.d.ts +44 -0
- package/dist/issue/index.d.ts.map +1 -0
- package/dist/issue/index.js +152 -0
- package/dist/json-schema/emit-combinator.d.ts +28 -0
- package/dist/json-schema/emit-combinator.d.ts.map +1 -0
- package/dist/json-schema/emit-combinator.js +96 -0
- package/dist/json-schema/emit-composite.d.ts +28 -0
- package/dist/json-schema/emit-composite.d.ts.map +1 -0
- package/dist/json-schema/emit-composite.js +127 -0
- package/dist/json-schema/emit-scalar.d.ts +25 -0
- package/dist/json-schema/emit-scalar.d.ts.map +1 -0
- package/dist/json-schema/emit-scalar.js +104 -0
- package/dist/json-schema/emit-types.d.ts +12 -0
- package/dist/json-schema/emit-types.d.ts.map +1 -0
- package/dist/json-schema/emit-types.js +5 -0
- package/dist/json-schema/emit.d.ts +12 -0
- package/dist/json-schema/emit.d.ts.map +1 -0
- package/dist/json-schema/emit.js +62 -0
- package/dist/json-schema/freeze.d.ts +14 -0
- package/dist/json-schema/freeze.d.ts.map +1 -0
- package/dist/json-schema/freeze.js +114 -0
- package/dist/json-schema/index.d.ts +20 -0
- package/dist/json-schema/index.d.ts.map +1 -0
- package/dist/json-schema/index.js +76 -0
- package/dist/json-schema/issue.d.ts +11 -0
- package/dist/json-schema/issue.d.ts.map +1 -0
- package/dist/json-schema/issue.js +14 -0
- package/dist/json-schema/read.d.ts +29 -0
- package/dist/json-schema/read.d.ts.map +1 -0
- package/dist/json-schema/read.js +87 -0
- package/dist/json-schema/types.d.ts +106 -0
- package/dist/json-schema/types.d.ts.map +1 -0
- package/dist/json-schema/types.js +5 -0
- package/dist/kind/index.d.ts +119 -0
- package/dist/kind/index.d.ts.map +1 -0
- package/dist/kind/index.js +94 -0
- package/dist/lower/index.d.ts +7 -0
- package/dist/lower/index.d.ts.map +1 -0
- package/dist/lower/index.js +199 -0
- package/dist/message/index.d.ts +51 -0
- package/dist/message/index.d.ts.map +1 -0
- package/dist/message/index.js +269 -0
- package/dist/optimize/compact.d.ts +10 -0
- package/dist/optimize/compact.d.ts.map +1 -0
- package/dist/optimize/compact.js +60 -0
- package/dist/optimize/fold-boolean.d.ts +15 -0
- package/dist/optimize/fold-boolean.d.ts.map +1 -0
- package/dist/optimize/fold-boolean.js +75 -0
- package/dist/optimize/fold-common.d.ts +45 -0
- package/dist/optimize/fold-common.d.ts.map +1 -0
- package/dist/optimize/fold-common.js +71 -0
- package/dist/optimize/fold-scalar.d.ts +59 -0
- package/dist/optimize/fold-scalar.d.ts.map +1 -0
- package/dist/optimize/fold-scalar.js +174 -0
- package/dist/optimize/fold.d.ts +10 -0
- package/dist/optimize/fold.d.ts.map +1 -0
- package/dist/optimize/fold.js +103 -0
- package/dist/optimize/index.d.ts +10 -0
- package/dist/optimize/index.d.ts.map +1 -0
- package/dist/optimize/index.js +23 -0
- package/dist/optimize/map-node.d.ts +21 -0
- package/dist/optimize/map-node.d.ts.map +1 -0
- package/dist/optimize/map-node.js +222 -0
- package/dist/optimize/remap.d.ts +30 -0
- package/dist/optimize/remap.d.ts.map +1 -0
- package/dist/optimize/remap.js +46 -0
- package/dist/optimize/rewrite.d.ts +22 -0
- package/dist/optimize/rewrite.d.ts.map +1 -0
- package/dist/optimize/rewrite.js +34 -0
- package/dist/plan/cache.d.ts +20 -0
- package/dist/plan/cache.d.ts.map +1 -0
- package/dist/plan/cache.js +122 -0
- package/dist/plan/index.d.ts +8 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +6 -0
- package/dist/plan/predicate.d.ts +27 -0
- package/dist/plan/predicate.d.ts.map +1 -0
- package/dist/plan/predicate.js +415 -0
- package/dist/plan/schema-predicate.d.ts +15 -0
- package/dist/plan/schema-predicate.d.ts.map +1 -0
- package/dist/plan/schema-predicate.js +277 -0
- package/dist/plan/types.d.ts +18 -0
- package/dist/plan/types.d.ts.map +1 -0
- package/dist/plan/types.js +5 -0
- package/dist/result/index.d.ts +27 -0
- package/dist/result/index.d.ts.map +1 -0
- package/dist/result/index.js +20 -0
- package/dist/schema/common.d.ts +30 -0
- package/dist/schema/common.d.ts.map +1 -0
- package/dist/schema/common.js +102 -0
- package/dist/schema/freeze.d.ts +10 -0
- package/dist/schema/freeze.d.ts.map +1 -0
- package/dist/schema/freeze.js +163 -0
- package/dist/schema/index.d.ts +11 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +9 -0
- package/dist/schema/lazy.d.ts +10 -0
- package/dist/schema/lazy.d.ts.map +1 -0
- package/dist/schema/lazy.js +25 -0
- package/dist/schema/literal.d.ts +10 -0
- package/dist/schema/literal.d.ts.map +1 -0
- package/dist/schema/literal.js +17 -0
- package/dist/schema/types.d.ts +243 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +9 -0
- package/dist/schema/validate.d.ts +10 -0
- package/dist/schema/validate.d.ts.map +1 -0
- package/dist/schema/validate.js +268 -0
- package/docs/api.md +301 -0
- package/docs/engine-notes.md +153 -0
- package/docs/index.html +1242 -0
- package/package.json +68 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/index.ts
|
|
3
|
+
* @brief Schema module aggregate.
|
|
4
|
+
*/
|
|
5
|
+
export { UUID_PATTERN } from "./types.js";
|
|
6
|
+
export { isLiteralValue } from "./literal.js";
|
|
7
|
+
export { isSchemaValue } from "./validate.js";
|
|
8
|
+
export { freezeSchema } from "./freeze.js";
|
|
9
|
+
export { resolveLazySchema } from "./lazy.js";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/lazy.ts
|
|
3
|
+
* @brief Lazy schema resolution.
|
|
4
|
+
*/
|
|
5
|
+
import type { LazySchema, Schema } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief resolve lazy schema.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveLazySchema(schema: LazySchema, resolving: WeakSet<object>): Schema;
|
|
10
|
+
//# sourceMappingURL=lazy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy.d.ts","sourceRoot":"","sources":["../../src/schema/lazy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAErD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,GACzB,MAAM,CAcR"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/lazy.ts
|
|
3
|
+
* @brief Lazy schema resolution.
|
|
4
|
+
*/
|
|
5
|
+
import { SchemaTag } from "../kind/index.js";
|
|
6
|
+
import { freezeSchema } from "./freeze.js";
|
|
7
|
+
import { isSchemaValue } from "./validate.js";
|
|
8
|
+
/**
|
|
9
|
+
* @brief resolve lazy schema.
|
|
10
|
+
*/
|
|
11
|
+
export function resolveLazySchema(schema, resolving) {
|
|
12
|
+
if (resolving.has(schema)) {
|
|
13
|
+
throw new TypeError("lazy schema cycle must resolve to a concrete schema");
|
|
14
|
+
}
|
|
15
|
+
resolving.add(schema);
|
|
16
|
+
const resolved = schema.get();
|
|
17
|
+
if (!isSchemaValue(resolved)) {
|
|
18
|
+
throw new TypeError("lazy schema must resolve to a valid TypeSea schema");
|
|
19
|
+
}
|
|
20
|
+
const concrete = resolved.tag === SchemaTag.Lazy
|
|
21
|
+
? resolveLazySchema(resolved, resolving)
|
|
22
|
+
: resolved;
|
|
23
|
+
resolving.delete(schema);
|
|
24
|
+
return freezeSchema(concrete);
|
|
25
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/literal.ts
|
|
3
|
+
* @brief Literal-value boundary checks.
|
|
4
|
+
*/
|
|
5
|
+
import type { LiteralValue } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief is literal value.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isLiteralValue(value: unknown): value is LiteralValue;
|
|
10
|
+
//# sourceMappingURL=literal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../src/schema/literal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAWpE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/literal.ts
|
|
3
|
+
* @brief Literal-value boundary checks.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @brief is literal value.
|
|
7
|
+
*/
|
|
8
|
+
export function isLiteralValue(value) {
|
|
9
|
+
const valueType = typeof value;
|
|
10
|
+
return (value === null ||
|
|
11
|
+
valueType === "string" ||
|
|
12
|
+
valueType === "number" ||
|
|
13
|
+
valueType === "bigint" ||
|
|
14
|
+
valueType === "boolean" ||
|
|
15
|
+
valueType === "symbol" ||
|
|
16
|
+
valueType === "undefined");
|
|
17
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/types.ts
|
|
3
|
+
* @brief Schema tags and structural TypeSea schema records.
|
|
4
|
+
*/
|
|
5
|
+
import { NumberCheckTag, ObjectModeTag, PresenceTag, SchemaTag, StringCheckTag } from "../kind/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief literal value.
|
|
8
|
+
*/
|
|
9
|
+
export type LiteralValue = string | number | bigint | boolean | symbol | null | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* @brief schema.
|
|
12
|
+
*/
|
|
13
|
+
export type Schema = UnknownSchema | NeverSchema | StringSchema | NumberSchema | BigIntSchema | SymbolSchema | BooleanSchema | LiteralSchema | ArraySchema | ObjectSchema | UnionSchema | IntersectionSchema | OptionalSchema | UndefinedableSchema | NullableSchema | DiscriminatedUnionSchema | BrandSchema | TupleSchema | RecordSchema | LazySchema | RefineSchema;
|
|
14
|
+
/**
|
|
15
|
+
* @brief unknown schema.
|
|
16
|
+
*/
|
|
17
|
+
export interface UnknownSchema {
|
|
18
|
+
readonly tag: typeof SchemaTag.Unknown;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @brief never schema.
|
|
22
|
+
*/
|
|
23
|
+
export interface NeverSchema {
|
|
24
|
+
readonly tag: typeof SchemaTag.Never;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* @brief string schema.
|
|
28
|
+
*/
|
|
29
|
+
export interface StringSchema {
|
|
30
|
+
readonly tag: typeof SchemaTag.String;
|
|
31
|
+
readonly checks: readonly StringCheck[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* @brief string check.
|
|
35
|
+
*/
|
|
36
|
+
export type StringCheck = StringMinCheck | StringMaxCheck | StringRegexCheck | StringUuidCheck;
|
|
37
|
+
/**
|
|
38
|
+
* @brief string min check.
|
|
39
|
+
*/
|
|
40
|
+
export interface StringMinCheck {
|
|
41
|
+
readonly tag: typeof StringCheckTag.Min;
|
|
42
|
+
readonly value: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* @brief string max check.
|
|
46
|
+
*/
|
|
47
|
+
export interface StringMaxCheck {
|
|
48
|
+
readonly tag: typeof StringCheckTag.Max;
|
|
49
|
+
readonly value: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @brief string regex check.
|
|
53
|
+
*/
|
|
54
|
+
export interface StringRegexCheck {
|
|
55
|
+
readonly tag: typeof StringCheckTag.Regex;
|
|
56
|
+
readonly regex: RegExp;
|
|
57
|
+
readonly name: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* @brief string uuid check.
|
|
61
|
+
*/
|
|
62
|
+
export interface StringUuidCheck {
|
|
63
|
+
readonly tag: typeof StringCheckTag.Uuid;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @brief number schema.
|
|
67
|
+
*/
|
|
68
|
+
export interface NumberSchema {
|
|
69
|
+
readonly tag: typeof SchemaTag.Number;
|
|
70
|
+
readonly checks: readonly NumberCheck[];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* @brief big int schema.
|
|
74
|
+
*/
|
|
75
|
+
export interface BigIntSchema {
|
|
76
|
+
readonly tag: typeof SchemaTag.BigInt;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* @brief symbol schema.
|
|
80
|
+
*/
|
|
81
|
+
export interface SymbolSchema {
|
|
82
|
+
readonly tag: typeof SchemaTag.Symbol;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* @brief number check.
|
|
86
|
+
*/
|
|
87
|
+
export type NumberCheck = NumberIntegerCheck | NumberGteCheck | NumberLteCheck;
|
|
88
|
+
/**
|
|
89
|
+
* @brief number integer check.
|
|
90
|
+
*/
|
|
91
|
+
export interface NumberIntegerCheck {
|
|
92
|
+
readonly tag: typeof NumberCheckTag.Integer;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* @brief number gte check.
|
|
96
|
+
*/
|
|
97
|
+
export interface NumberGteCheck {
|
|
98
|
+
readonly tag: typeof NumberCheckTag.Gte;
|
|
99
|
+
readonly value: number;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* @brief number lte check.
|
|
103
|
+
*/
|
|
104
|
+
export interface NumberLteCheck {
|
|
105
|
+
readonly tag: typeof NumberCheckTag.Lte;
|
|
106
|
+
readonly value: number;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* @brief boolean schema.
|
|
110
|
+
*/
|
|
111
|
+
export interface BooleanSchema {
|
|
112
|
+
readonly tag: typeof SchemaTag.Boolean;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* @brief literal schema.
|
|
116
|
+
*/
|
|
117
|
+
export interface LiteralSchema {
|
|
118
|
+
readonly tag: typeof SchemaTag.Literal;
|
|
119
|
+
readonly value: LiteralValue;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* @brief array schema.
|
|
123
|
+
*/
|
|
124
|
+
export interface ArraySchema {
|
|
125
|
+
readonly tag: typeof SchemaTag.Array;
|
|
126
|
+
readonly item: Schema;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* @brief tuple schema.
|
|
130
|
+
*/
|
|
131
|
+
export interface TupleSchema {
|
|
132
|
+
readonly tag: typeof SchemaTag.Tuple;
|
|
133
|
+
readonly items: readonly Schema[];
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* @brief record schema.
|
|
137
|
+
*/
|
|
138
|
+
export interface RecordSchema {
|
|
139
|
+
readonly tag: typeof SchemaTag.Record;
|
|
140
|
+
readonly value: Schema;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* @brief object schema.
|
|
144
|
+
*/
|
|
145
|
+
export interface ObjectSchema {
|
|
146
|
+
readonly tag: typeof SchemaTag.Object;
|
|
147
|
+
readonly entries: readonly ObjectEntry[];
|
|
148
|
+
readonly keys: readonly string[];
|
|
149
|
+
readonly keyLookup: ObjectKeyLookup;
|
|
150
|
+
readonly mode: ObjectModeTag;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* @brief object key lookup.
|
|
154
|
+
*/
|
|
155
|
+
export type ObjectKeyLookup = Readonly<Record<string, true>>;
|
|
156
|
+
/**
|
|
157
|
+
* @brief object entry.
|
|
158
|
+
*/
|
|
159
|
+
export interface ObjectEntry {
|
|
160
|
+
readonly key: string;
|
|
161
|
+
readonly schema: Schema;
|
|
162
|
+
readonly presence: PresenceTag;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* @brief union schema.
|
|
166
|
+
*/
|
|
167
|
+
export interface UnionSchema {
|
|
168
|
+
readonly tag: typeof SchemaTag.Union;
|
|
169
|
+
readonly options: readonly Schema[];
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* @brief intersection schema.
|
|
173
|
+
*/
|
|
174
|
+
export interface IntersectionSchema {
|
|
175
|
+
readonly tag: typeof SchemaTag.Intersection;
|
|
176
|
+
readonly left: Schema;
|
|
177
|
+
readonly right: Schema;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* @brief optional schema.
|
|
181
|
+
*/
|
|
182
|
+
export interface OptionalSchema {
|
|
183
|
+
readonly tag: typeof SchemaTag.Optional;
|
|
184
|
+
readonly inner: Schema;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* @brief undefinedable schema.
|
|
188
|
+
*/
|
|
189
|
+
export interface UndefinedableSchema {
|
|
190
|
+
readonly tag: typeof SchemaTag.Undefinedable;
|
|
191
|
+
readonly inner: Schema;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* @brief nullable schema.
|
|
195
|
+
*/
|
|
196
|
+
export interface NullableSchema {
|
|
197
|
+
readonly tag: typeof SchemaTag.Nullable;
|
|
198
|
+
readonly inner: Schema;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* @brief discriminated union schema.
|
|
202
|
+
*/
|
|
203
|
+
export interface DiscriminatedUnionSchema {
|
|
204
|
+
readonly tag: typeof SchemaTag.DiscriminatedUnion;
|
|
205
|
+
readonly key: string;
|
|
206
|
+
readonly cases: readonly DiscriminatedUnionCase[];
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* @brief discriminated union case.
|
|
210
|
+
*/
|
|
211
|
+
export interface DiscriminatedUnionCase {
|
|
212
|
+
readonly literal: string;
|
|
213
|
+
readonly schema: Schema;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* @brief brand schema.
|
|
217
|
+
*/
|
|
218
|
+
export interface BrandSchema {
|
|
219
|
+
readonly tag: typeof SchemaTag.Brand;
|
|
220
|
+
readonly inner: Schema;
|
|
221
|
+
readonly brand: string;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* @brief lazy schema.
|
|
225
|
+
*/
|
|
226
|
+
export interface LazySchema {
|
|
227
|
+
readonly tag: typeof SchemaTag.Lazy;
|
|
228
|
+
readonly get: () => Schema;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* @brief refine schema.
|
|
232
|
+
*/
|
|
233
|
+
export interface RefineSchema {
|
|
234
|
+
readonly tag: typeof SchemaTag.Refine;
|
|
235
|
+
readonly inner: Schema;
|
|
236
|
+
readonly predicate: (value: unknown) => boolean;
|
|
237
|
+
readonly name: string;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* @brief uuid pattern.
|
|
241
|
+
*/
|
|
242
|
+
export declare const UUID_PATTERN: RegExp;
|
|
243
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/schema/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/types.ts
|
|
3
|
+
* @brief Schema tags and structural TypeSea schema records.
|
|
4
|
+
*/
|
|
5
|
+
import { NumberCheckTag, ObjectModeTag, PresenceTag, SchemaTag, StringCheckTag } from "../kind/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief uuid pattern.
|
|
8
|
+
*/
|
|
9
|
+
export const UUID_PATTERN = /^(?:00000000-0000-0000-0000-000000000000|[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})$/iu;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/validate.ts
|
|
3
|
+
* @brief Runtime validators for direct schema objects.
|
|
4
|
+
*/
|
|
5
|
+
import type { Schema } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief is schema value.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isSchemaValue(value: unknown): value is Schema;
|
|
10
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/schema/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,OAAO,KAAK,EAEV,MAAM,EAEP,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAK7D"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/validate.ts
|
|
3
|
+
* @brief Runtime validators for direct schema objects.
|
|
4
|
+
*/
|
|
5
|
+
import { NumberCheckTag, ObjectModeTag, PresenceTag, SchemaTag, StringCheckTag } from "../kind/index.js";
|
|
6
|
+
import { isLiteralValue } from "./literal.js";
|
|
7
|
+
import { includesString, isObjectKeyLookup, isPlainRegExp, isRecord, isStringArray, isUnknownArray } from "./common.js";
|
|
8
|
+
/**
|
|
9
|
+
* @brief is schema value.
|
|
10
|
+
*/
|
|
11
|
+
export function isSchemaValue(value) {
|
|
12
|
+
return isSchemaValueInner(value, {
|
|
13
|
+
validated: new WeakSet(),
|
|
14
|
+
visiting: new WeakSet()
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* @brief is schema value inner.
|
|
19
|
+
*/
|
|
20
|
+
function isSchemaValueInner(value, state) {
|
|
21
|
+
if (!isRecord(value)) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
if (state.validated.has(value)) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
if (state.visiting.has(value)) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
state.visiting.add(value);
|
|
31
|
+
const valid = isSchemaRecord(value, state);
|
|
32
|
+
state.visiting.delete(value);
|
|
33
|
+
if (valid) {
|
|
34
|
+
state.validated.add(value);
|
|
35
|
+
}
|
|
36
|
+
return valid;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* @brief is schema record.
|
|
40
|
+
*/
|
|
41
|
+
function isSchemaRecord(value, state) {
|
|
42
|
+
switch (value["tag"]) {
|
|
43
|
+
case SchemaTag.Unknown:
|
|
44
|
+
case SchemaTag.Never:
|
|
45
|
+
case SchemaTag.BigInt:
|
|
46
|
+
case SchemaTag.Symbol:
|
|
47
|
+
case SchemaTag.Boolean:
|
|
48
|
+
return true;
|
|
49
|
+
case SchemaTag.String:
|
|
50
|
+
return isStringChecks(value["checks"]);
|
|
51
|
+
case SchemaTag.Number:
|
|
52
|
+
return isNumberChecks(value["checks"]);
|
|
53
|
+
case SchemaTag.Literal:
|
|
54
|
+
return isLiteralValue(value["value"]);
|
|
55
|
+
case SchemaTag.Array:
|
|
56
|
+
return isSchemaValueInner(value["item"], state);
|
|
57
|
+
case SchemaTag.Tuple:
|
|
58
|
+
return isSchemaArray(value["items"], state);
|
|
59
|
+
case SchemaTag.Record:
|
|
60
|
+
return isSchemaValueInner(value["value"], state);
|
|
61
|
+
case SchemaTag.Object:
|
|
62
|
+
return isObjectSchemaValue(value, state);
|
|
63
|
+
case SchemaTag.Union:
|
|
64
|
+
return isSchemaArray(value["options"], state);
|
|
65
|
+
case SchemaTag.Intersection:
|
|
66
|
+
return isSchemaValueInner(value["left"], state) &&
|
|
67
|
+
isSchemaValueInner(value["right"], state);
|
|
68
|
+
case SchemaTag.Optional:
|
|
69
|
+
case SchemaTag.Undefinedable:
|
|
70
|
+
case SchemaTag.Nullable:
|
|
71
|
+
return isSchemaValueInner(value["inner"], state);
|
|
72
|
+
case SchemaTag.DiscriminatedUnion:
|
|
73
|
+
return isDiscriminatedUnionSchemaValue(value, state);
|
|
74
|
+
case SchemaTag.Brand:
|
|
75
|
+
return typeof value["brand"] === "string" &&
|
|
76
|
+
isSchemaValueInner(value["inner"], state);
|
|
77
|
+
case SchemaTag.Lazy:
|
|
78
|
+
return typeof value["get"] === "function";
|
|
79
|
+
case SchemaTag.Refine:
|
|
80
|
+
return typeof value["name"] === "string" &&
|
|
81
|
+
typeof value["predicate"] === "function" &&
|
|
82
|
+
isSchemaValueInner(value["inner"], state);
|
|
83
|
+
default:
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* @brief is string checks.
|
|
89
|
+
*/
|
|
90
|
+
function isStringChecks(value) {
|
|
91
|
+
if (!isUnknownArray(value)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
95
|
+
const check = value[index];
|
|
96
|
+
if (!isRecord(check)) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
switch (check["tag"]) {
|
|
100
|
+
case StringCheckTag.Min:
|
|
101
|
+
case StringCheckTag.Max: {
|
|
102
|
+
const bound = check["value"];
|
|
103
|
+
if (typeof bound !== "number" || !Number.isInteger(bound) || bound < 0) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
case StringCheckTag.Regex:
|
|
109
|
+
if (!isPlainRegExp(check["regex"]) || typeof check["name"] !== "string") {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
break;
|
|
113
|
+
case StringCheckTag.Uuid:
|
|
114
|
+
break;
|
|
115
|
+
default:
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* @brief is number checks.
|
|
123
|
+
*/
|
|
124
|
+
function isNumberChecks(value) {
|
|
125
|
+
if (!isUnknownArray(value)) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
129
|
+
const check = value[index];
|
|
130
|
+
if (!isRecord(check)) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
switch (check["tag"]) {
|
|
134
|
+
case NumberCheckTag.Integer:
|
|
135
|
+
break;
|
|
136
|
+
case NumberCheckTag.Gte:
|
|
137
|
+
case NumberCheckTag.Lte: {
|
|
138
|
+
const bound = check["value"];
|
|
139
|
+
if (typeof bound !== "number" || !Number.isFinite(bound)) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
default:
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* @brief is schema array.
|
|
152
|
+
*/
|
|
153
|
+
function isSchemaArray(value, state) {
|
|
154
|
+
if (!isUnknownArray(value)) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
158
|
+
if (!isSchemaValueInner(value[index], state)) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* @brief is object schema value.
|
|
166
|
+
*/
|
|
167
|
+
function isObjectSchemaValue(value, state) {
|
|
168
|
+
if (value["mode"] !== ObjectModeTag.Passthrough &&
|
|
169
|
+
value["mode"] !== ObjectModeTag.Strict) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
const entries = value["entries"];
|
|
173
|
+
const keys = value["keys"];
|
|
174
|
+
const keyLookup = value["keyLookup"];
|
|
175
|
+
if (!isUnknownArray(entries) || !isStringArray(keys) ||
|
|
176
|
+
!isObjectKeyLookup(keyLookup, keys) || entries.length !== keys.length) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
const seen = [];
|
|
180
|
+
for (let index = 0; index < entries.length; index += 1) {
|
|
181
|
+
const entry = entries[index];
|
|
182
|
+
if (!isRecord(entry) ||
|
|
183
|
+
typeof entry["key"] !== "string" ||
|
|
184
|
+
entry["key"] !== keys[index] ||
|
|
185
|
+
includesString(seen, entry["key"]) ||
|
|
186
|
+
(entry["presence"] !== PresenceTag.Required &&
|
|
187
|
+
entry["presence"] !== PresenceTag.Optional) ||
|
|
188
|
+
!isSchemaValueInner(entry["schema"], state)) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
seen.push(entry["key"]);
|
|
192
|
+
}
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* @brief is discriminated union schema value.
|
|
197
|
+
*/
|
|
198
|
+
function isDiscriminatedUnionSchemaValue(value, state) {
|
|
199
|
+
const cases = value["cases"];
|
|
200
|
+
const key = value["key"];
|
|
201
|
+
if (typeof key !== "string" || !isUnknownArray(cases) || cases.length === 0) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
const literals = [];
|
|
205
|
+
for (let index = 0; index < cases.length; index += 1) {
|
|
206
|
+
const unionCase = cases[index];
|
|
207
|
+
if (!isRecord(unionCase) || typeof unionCase["literal"] !== "string" ||
|
|
208
|
+
includesString(literals, unionCase["literal"]) ||
|
|
209
|
+
!isSchemaValueInner(unionCase["schema"], state) ||
|
|
210
|
+
!caseRequiresDiscriminant(unionCase["schema"], key, unionCase["literal"])) {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
literals.push(unionCase["literal"]);
|
|
214
|
+
}
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* @brief case requires discriminant.
|
|
219
|
+
*/
|
|
220
|
+
function caseRequiresDiscriminant(schema, key, literal) {
|
|
221
|
+
const objectSchema = unwrapCaseObjectSchema(schema);
|
|
222
|
+
if (objectSchema === undefined) {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
const entries = objectSchema.entries;
|
|
226
|
+
for (let index = 0; index < entries.length; index += 1) {
|
|
227
|
+
const entry = entries[index];
|
|
228
|
+
if (entry?.key !== key) {
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
return entry.presence === PresenceTag.Required &&
|
|
232
|
+
schemaRequiresLiteral(entry.schema, literal);
|
|
233
|
+
}
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* @brief unwrap case object schema.
|
|
238
|
+
*/
|
|
239
|
+
function unwrapCaseObjectSchema(schema) {
|
|
240
|
+
switch (schema.tag) {
|
|
241
|
+
case SchemaTag.Object:
|
|
242
|
+
return schema;
|
|
243
|
+
case SchemaTag.Intersection:
|
|
244
|
+
return unwrapCaseObjectSchema(schema.left) ?? unwrapCaseObjectSchema(schema.right);
|
|
245
|
+
case SchemaTag.Brand:
|
|
246
|
+
case SchemaTag.Refine:
|
|
247
|
+
return unwrapCaseObjectSchema(schema.inner);
|
|
248
|
+
default:
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* @brief schema requires literal.
|
|
254
|
+
*/
|
|
255
|
+
function schemaRequiresLiteral(schema, literal) {
|
|
256
|
+
switch (schema.tag) {
|
|
257
|
+
case SchemaTag.Literal:
|
|
258
|
+
return Object.is(schema.value, literal);
|
|
259
|
+
case SchemaTag.Intersection:
|
|
260
|
+
return schemaRequiresLiteral(schema.left, literal) ||
|
|
261
|
+
schemaRequiresLiteral(schema.right, literal);
|
|
262
|
+
case SchemaTag.Brand:
|
|
263
|
+
case SchemaTag.Refine:
|
|
264
|
+
return schemaRequiresLiteral(schema.inner, literal);
|
|
265
|
+
default:
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
}
|