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,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file shared.ts
|
|
3
|
+
* @brief Shared scalar helpers for schema evaluation.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @brief has object key.
|
|
7
|
+
*/
|
|
8
|
+
export function hasObjectKey(keyLookup, key) {
|
|
9
|
+
return Object.prototype.hasOwnProperty.call(keyLookup, key);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* @brief read own data property.
|
|
13
|
+
* @details Reads one own property through its descriptor so getters are not executed.
|
|
14
|
+
* @returns Own data descriptor, or undefined for missing/accessor properties.
|
|
15
|
+
*/
|
|
16
|
+
export function readOwnDataProperty(record, key) {
|
|
17
|
+
const descriptor = Object.getOwnPropertyDescriptor(record, key);
|
|
18
|
+
if (descriptor === undefined || !isDataPropertyDescriptor(descriptor)) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
return descriptor;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @brief find discriminated union case.
|
|
25
|
+
*/
|
|
26
|
+
export function findDiscriminatedUnionCase(cases, value) {
|
|
27
|
+
for (let index = 0; index < cases.length; index += 1) {
|
|
28
|
+
const unionCase = cases[index];
|
|
29
|
+
if (unionCase !== undefined && Object.is(unionCase.literal, value)) {
|
|
30
|
+
return unionCase.schema;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* @brief is strict true.
|
|
37
|
+
*/
|
|
38
|
+
export function isStrictTrue(value) {
|
|
39
|
+
return value === true;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @brief is plain record.
|
|
43
|
+
*/
|
|
44
|
+
export function isPlainRecord(value) {
|
|
45
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* @brief is data property descriptor.
|
|
49
|
+
* @details Checks that a descriptor contains a data value instead of getter/setter code.
|
|
50
|
+
* @returns True when the descriptor has a stable value slot.
|
|
51
|
+
*/
|
|
52
|
+
export function isDataPropertyDescriptor(descriptor) {
|
|
53
|
+
return Object.prototype.hasOwnProperty.call(descriptor, "value");
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* @brief actual type.
|
|
57
|
+
*/
|
|
58
|
+
export function actualType(value) {
|
|
59
|
+
if (value === null) {
|
|
60
|
+
return "null";
|
|
61
|
+
}
|
|
62
|
+
if (Array.isArray(value)) {
|
|
63
|
+
return "array";
|
|
64
|
+
}
|
|
65
|
+
if (typeof value === "bigint") {
|
|
66
|
+
return "bigint";
|
|
67
|
+
}
|
|
68
|
+
if (typeof value === "symbol") {
|
|
69
|
+
return "symbol";
|
|
70
|
+
}
|
|
71
|
+
if (typeof value === "number" && Number.isNaN(value)) {
|
|
72
|
+
return "nan";
|
|
73
|
+
}
|
|
74
|
+
return typeof value;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* @brief literal to expected.
|
|
78
|
+
*/
|
|
79
|
+
export function literalToExpected(value) {
|
|
80
|
+
if (value === null) {
|
|
81
|
+
return "null";
|
|
82
|
+
}
|
|
83
|
+
if (value === undefined) {
|
|
84
|
+
return "undefined";
|
|
85
|
+
}
|
|
86
|
+
if (typeof value === "string") {
|
|
87
|
+
return JSON.stringify(value);
|
|
88
|
+
}
|
|
89
|
+
if (typeof value === "number" && Object.is(value, -0)) {
|
|
90
|
+
return "-0";
|
|
91
|
+
}
|
|
92
|
+
if (typeof value === "symbol") {
|
|
93
|
+
return String(value);
|
|
94
|
+
}
|
|
95
|
+
return String(value);
|
|
96
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file state.ts
|
|
3
|
+
* @brief Recursive validation state for cyclic input graphs.
|
|
4
|
+
*/
|
|
5
|
+
import type { Schema } from "../schema/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief validation enter result.
|
|
8
|
+
* @details Defines the control-flow result of entering a schema/value pair.
|
|
9
|
+
* @invariant Only `entered` requires a matching leave operation.
|
|
10
|
+
*/
|
|
11
|
+
export type ValidationEnterResult = "entered" | "cycle" | "budget";
|
|
12
|
+
/**
|
|
13
|
+
* @brief default max validation depth.
|
|
14
|
+
* @invariant The value stays below the V8 stack depth that recursive lazy schemas can exhaust.
|
|
15
|
+
*/
|
|
16
|
+
export declare const DEFAULT_MAX_VALIDATION_DEPTH = 256;
|
|
17
|
+
/**
|
|
18
|
+
* @brief graph evaluation frame.
|
|
19
|
+
* @details Owns scratch slots for one active Sea-of-Nodes graph execution.
|
|
20
|
+
* @invariant `seen[id] === epoch` means `values[id]` belongs to the current run.
|
|
21
|
+
*/
|
|
22
|
+
export interface GraphEvaluationFrame {
|
|
23
|
+
values: unknown[];
|
|
24
|
+
seen: Uint32Array;
|
|
25
|
+
epoch: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @brief validation state.
|
|
29
|
+
*/
|
|
30
|
+
export interface ValidationState {
|
|
31
|
+
readonly active: WeakMap<object, WeakSet<Schema>>;
|
|
32
|
+
readonly graphFrames: GraphEvaluationFrame[];
|
|
33
|
+
readonly resolving: WeakSet<object>;
|
|
34
|
+
/**
|
|
35
|
+
* @brief depth.
|
|
36
|
+
* @details Counts active recursive validator frames owned by this state object.
|
|
37
|
+
* @invariant The value is incremented only after budget admission and decremented by `leaveValidation`.
|
|
38
|
+
*/
|
|
39
|
+
depth: number;
|
|
40
|
+
/**
|
|
41
|
+
* @brief graph depth.
|
|
42
|
+
* @details Counts active nested graph executions using `graphFrames` as a stack.
|
|
43
|
+
* @invariant Incremented by IR execution before frame use and decremented after it.
|
|
44
|
+
*/
|
|
45
|
+
graphDepth: number;
|
|
46
|
+
/**
|
|
47
|
+
* @brief max depth.
|
|
48
|
+
* @details Hard cap for recursive validator frames.
|
|
49
|
+
* @invariant Entering past this limit returns `budget` instead of recursing.
|
|
50
|
+
*/
|
|
51
|
+
readonly maxDepth: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @brief make validation state.
|
|
55
|
+
*/
|
|
56
|
+
export declare function makeValidationState(): ValidationState;
|
|
57
|
+
/**
|
|
58
|
+
* @brief enter validation.
|
|
59
|
+
*/
|
|
60
|
+
export declare function enterValidation(schema: Schema, value: unknown, state: ValidationState): ValidationEnterResult;
|
|
61
|
+
/**
|
|
62
|
+
* @brief leave validation.
|
|
63
|
+
*/
|
|
64
|
+
export declare function leaveValidation(schema: Schema, value: unknown, state: ValidationState): void;
|
|
65
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/evaluate/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAC7B,SAAS,GACT,OAAO,GACP,QAAQ,CAAC;AAEb;;;GAGG;AACH,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,oBAAoB,EAAE,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpC;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,eAAe,CASrD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,eAAe,GACrB,qBAAqB,CAoBvB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,eAAe,GACrB,IAAI,CAUN"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file state.ts
|
|
3
|
+
* @brief Recursive validation state for cyclic input graphs.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @brief default max validation depth.
|
|
7
|
+
* @invariant The value stays below the V8 stack depth that recursive lazy schemas can exhaust.
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_MAX_VALIDATION_DEPTH = 256;
|
|
10
|
+
/**
|
|
11
|
+
* @brief make validation state.
|
|
12
|
+
*/
|
|
13
|
+
export function makeValidationState() {
|
|
14
|
+
return {
|
|
15
|
+
active: new WeakMap(),
|
|
16
|
+
graphFrames: [],
|
|
17
|
+
resolving: new WeakSet(),
|
|
18
|
+
depth: 0,
|
|
19
|
+
graphDepth: 0,
|
|
20
|
+
maxDepth: DEFAULT_MAX_VALIDATION_DEPTH
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @brief enter validation.
|
|
25
|
+
*/
|
|
26
|
+
export function enterValidation(schema, value, state) {
|
|
27
|
+
const cached = isReferenceValue(value) ? state.active.get(value) : undefined;
|
|
28
|
+
if (cached?.has(schema) === true) {
|
|
29
|
+
return "cycle";
|
|
30
|
+
}
|
|
31
|
+
if (state.depth >= state.maxDepth) {
|
|
32
|
+
return "budget";
|
|
33
|
+
}
|
|
34
|
+
state.depth += 1;
|
|
35
|
+
if (!isReferenceValue(value)) {
|
|
36
|
+
return "entered";
|
|
37
|
+
}
|
|
38
|
+
if (cached !== undefined) {
|
|
39
|
+
cached.add(schema);
|
|
40
|
+
return "entered";
|
|
41
|
+
}
|
|
42
|
+
const schemas = new WeakSet();
|
|
43
|
+
schemas.add(schema);
|
|
44
|
+
state.active.set(value, schemas);
|
|
45
|
+
return "entered";
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* @brief leave validation.
|
|
49
|
+
*/
|
|
50
|
+
export function leaveValidation(schema, value, state) {
|
|
51
|
+
if (!isReferenceValue(value)) {
|
|
52
|
+
state.depth -= 1;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const cached = state.active.get(value);
|
|
56
|
+
if (cached !== undefined) {
|
|
57
|
+
cached.delete(schema);
|
|
58
|
+
}
|
|
59
|
+
state.depth -= 1;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* @brief is reference value.
|
|
63
|
+
*/
|
|
64
|
+
function isReferenceValue(value) {
|
|
65
|
+
return (typeof value === "object" && value !== null) || typeof value === "function";
|
|
66
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file base.ts
|
|
3
|
+
* @brief Base guard implementation.
|
|
4
|
+
*/
|
|
5
|
+
import type { CheckResult } from "../issue/index.js";
|
|
6
|
+
import type { Graph } from "../ir/index.js";
|
|
7
|
+
import type { Schema } from "../schema/index.js";
|
|
8
|
+
import type { Brand, Guard, Infer, Presence, PresenceSymbol, RuntimeValue, TypeSymbol } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* @brief base guard.
|
|
11
|
+
* @details Owns its state directly; methods expose receiver checks and explicit result flow.
|
|
12
|
+
* @invariant Construction leaves the instance in a fully usable state before it escapes.
|
|
13
|
+
*/
|
|
14
|
+
export declare class BaseGuard<TValue, TPresence extends Presence = "required"> implements Guard<TValue, TPresence> {
|
|
15
|
+
readonly [TypeSymbol]: TValue;
|
|
16
|
+
readonly [PresenceSymbol]: TPresence;
|
|
17
|
+
readonly schema: Schema;
|
|
18
|
+
/**
|
|
19
|
+
* @brief constructor.
|
|
20
|
+
* @post The receiver is initialized according to the class invariant before it can be observed.
|
|
21
|
+
*/
|
|
22
|
+
constructor(schema: Schema);
|
|
23
|
+
/**
|
|
24
|
+
* @brief is.
|
|
25
|
+
*/
|
|
26
|
+
is(this: unknown, value: unknown): value is RuntimeValue<TValue, TPresence>;
|
|
27
|
+
/**
|
|
28
|
+
* @brief check.
|
|
29
|
+
*/
|
|
30
|
+
check(this: unknown, value: unknown): CheckResult<RuntimeValue<TValue, TPresence>>;
|
|
31
|
+
/**
|
|
32
|
+
* @brief assert.
|
|
33
|
+
*/
|
|
34
|
+
assert(this: unknown, value: unknown): asserts value is RuntimeValue<TValue, TPresence>;
|
|
35
|
+
/**
|
|
36
|
+
* @brief graph.
|
|
37
|
+
*/
|
|
38
|
+
graph(this: unknown): Graph;
|
|
39
|
+
/**
|
|
40
|
+
* @brief optional.
|
|
41
|
+
*/
|
|
42
|
+
optional(): BaseGuard<TValue, "optional">;
|
|
43
|
+
/**
|
|
44
|
+
* @brief undefinedable.
|
|
45
|
+
*/
|
|
46
|
+
undefinedable(): BaseGuard<TValue | undefined, TPresence>;
|
|
47
|
+
/**
|
|
48
|
+
* @brief nullable.
|
|
49
|
+
*/
|
|
50
|
+
nullable(): BaseGuard<TValue | null, TPresence>;
|
|
51
|
+
/**
|
|
52
|
+
* @brief array.
|
|
53
|
+
*/
|
|
54
|
+
array(): BaseGuard<RuntimeValue<TValue, TPresence>[]>;
|
|
55
|
+
/**
|
|
56
|
+
* @brief brand.
|
|
57
|
+
*/
|
|
58
|
+
brand<TBrand extends string>(): BaseGuard<Brand<TValue, TBrand>, TPresence>;
|
|
59
|
+
/**
|
|
60
|
+
* @brief refine.
|
|
61
|
+
*/
|
|
62
|
+
refine(predicate: (value: RuntimeValue<TValue, TPresence>) => boolean, name: string): BaseGuard<TValue, TPresence>;
|
|
63
|
+
/**
|
|
64
|
+
* @brief or.
|
|
65
|
+
*/
|
|
66
|
+
or<TOther extends Guard<unknown, Presence>>(other: TOther): BaseGuard<RuntimeValue<TValue, TPresence> | Infer<TOther>>;
|
|
67
|
+
/**
|
|
68
|
+
* @brief intersect.
|
|
69
|
+
*/
|
|
70
|
+
intersect<TOther extends Guard<unknown, Presence>>(other: TOther): BaseGuard<RuntimeValue<TValue, TPresence> & Infer<TOther>>;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/guard/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AASjD,OAAO,KAAK,EACV,KAAK,EACL,KAAK,EACL,KAAK,EACL,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,qBAAa,SAAS,CACpB,MAAM,EACN,SAAS,SAAS,QAAQ,GAAG,UAAU,CACvC,YAAW,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;IACnC,SAAwB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7C,SAAwB,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC;IACpD,SAAwB,MAAM,EAAE,MAAM,CAAC;IAEvC;;;OAGG;gBACgB,MAAM,EAAE,MAAM;IAQjC;;eAEW;IACJ,EAAE,CACP,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;IAI3C;;eAEW;IACJ,KAAK,CACV,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,OAAO,GACb,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAO/C;;eAEW;IACJ,MAAM,CACX,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;IAUnD;;aAES;IACF,KAAK,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK;IAIlC;;WAEO;IACA,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC;IAOhD;;WAEO;IACA,aAAa,IAAI,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,SAAS,CAAC;IAOhE;;WAEO;IACA,QAAQ,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI,EAAE,SAAS,CAAC;IAOtD;;WAEO;IACA,KAAK,IAAI,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;IAO5D;;WAEO;IACA,KAAK,CAAC,MAAM,SAAS,MAAM,KAAK,SAAS,CAC9C,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,EACrB,SAAS,CACV;IAQD;;eAEW;IACJ,MAAM,CACX,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,OAAO,EAC9D,IAAI,EAAE,MAAM,GACX,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC;IAW/B;;aAES;IACF,EAAE,CAAC,MAAM,SAAS,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC/C,KAAK,EAAE,MAAM,GACZ,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAY7D;;aAES;IACF,SAAS,CAAC,MAAM,SAAS,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,EACtD,KAAK,EAAE,MAAM,GACZ,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;CAO9D"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file base.ts
|
|
3
|
+
* @brief Base guard implementation.
|
|
4
|
+
*/
|
|
5
|
+
import { SchemaTag } from "../kind/index.js";
|
|
6
|
+
import { checkSchema, isSchema } from "../evaluate/index.js";
|
|
7
|
+
import { makeValidationPlan } from "../plan/index.js";
|
|
8
|
+
import { TypeSeaAssertionError } from "./error.js";
|
|
9
|
+
import { checkRefinementInput, readConstructorSchema, readGuardSchema } from "./read.js";
|
|
10
|
+
import { defineReadonlyProperty, isStrictTrue } from "./props.js";
|
|
11
|
+
import { registerConstructedGuard } from "./registry.js";
|
|
12
|
+
/**
|
|
13
|
+
* @brief base guard.
|
|
14
|
+
* @details Owns its state directly; methods expose receiver checks and explicit result flow.
|
|
15
|
+
* @invariant Construction leaves the instance in a fully usable state before it escapes.
|
|
16
|
+
*/
|
|
17
|
+
export class BaseGuard {
|
|
18
|
+
/**
|
|
19
|
+
* @brief constructor.
|
|
20
|
+
* @post The receiver is initialized according to the class invariant before it can be observed.
|
|
21
|
+
*/
|
|
22
|
+
constructor(schema) {
|
|
23
|
+
defineReadonlyProperty(this, "schema", readConstructorSchema(schema), true);
|
|
24
|
+
registerConstructedGuard(this);
|
|
25
|
+
if (new.target === BaseGuard) {
|
|
26
|
+
Object.freeze(this);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* @brief is.
|
|
31
|
+
*/
|
|
32
|
+
is(value) {
|
|
33
|
+
return isSchema(readGuardSchema(this, "guard receiver"), value);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* @brief check.
|
|
37
|
+
*/
|
|
38
|
+
check(value) {
|
|
39
|
+
return checkSchema(readGuardSchema(this, "guard receiver"), value);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @brief assert.
|
|
43
|
+
*/
|
|
44
|
+
assert(value) {
|
|
45
|
+
const result = checkSchema(readGuardSchema(this, "guard receiver"), value);
|
|
46
|
+
if (!result.ok) {
|
|
47
|
+
throw new TypeSeaAssertionError(result.error);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* @brief graph.
|
|
52
|
+
*/
|
|
53
|
+
graph() {
|
|
54
|
+
return makeValidationPlan(readGuardSchema(this, "guard receiver")).graph;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* @brief optional.
|
|
58
|
+
*/
|
|
59
|
+
optional() {
|
|
60
|
+
return new BaseGuard({
|
|
61
|
+
tag: SchemaTag.Optional,
|
|
62
|
+
inner: readGuardSchema(this, "optional inner")
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @brief undefinedable.
|
|
67
|
+
*/
|
|
68
|
+
undefinedable() {
|
|
69
|
+
return new BaseGuard({
|
|
70
|
+
tag: SchemaTag.Undefinedable,
|
|
71
|
+
inner: readGuardSchema(this, "undefinedable inner")
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* @brief nullable.
|
|
76
|
+
*/
|
|
77
|
+
nullable() {
|
|
78
|
+
return new BaseGuard({
|
|
79
|
+
tag: SchemaTag.Nullable,
|
|
80
|
+
inner: readGuardSchema(this, "nullable inner")
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* @brief array.
|
|
85
|
+
*/
|
|
86
|
+
array() {
|
|
87
|
+
return new BaseGuard({
|
|
88
|
+
tag: SchemaTag.Array,
|
|
89
|
+
item: readGuardSchema(this, "array item")
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* @brief brand.
|
|
94
|
+
*/
|
|
95
|
+
brand() {
|
|
96
|
+
return new BaseGuard({
|
|
97
|
+
tag: SchemaTag.Brand,
|
|
98
|
+
inner: readGuardSchema(this, "brand inner"),
|
|
99
|
+
brand: ""
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* @brief refine.
|
|
104
|
+
*/
|
|
105
|
+
refine(predicate, name) {
|
|
106
|
+
checkRefinementInput(predicate, name);
|
|
107
|
+
return new BaseGuard({
|
|
108
|
+
tag: SchemaTag.Refine,
|
|
109
|
+
inner: readGuardSchema(this, "refine inner"),
|
|
110
|
+
predicate: (value) => isStrictTrue(predicate(value)),
|
|
111
|
+
name
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* @brief or.
|
|
116
|
+
*/
|
|
117
|
+
or(other) {
|
|
118
|
+
return new BaseGuard({
|
|
119
|
+
tag: SchemaTag.Union,
|
|
120
|
+
options: [
|
|
121
|
+
readGuardSchema(this, "union option 0"),
|
|
122
|
+
readGuardSchema(other, "union option 1")
|
|
123
|
+
]
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* @brief intersect.
|
|
128
|
+
*/
|
|
129
|
+
intersect(other) {
|
|
130
|
+
return new BaseGuard({
|
|
131
|
+
tag: SchemaTag.Intersection,
|
|
132
|
+
left: readGuardSchema(this, "intersection left"),
|
|
133
|
+
right: readGuardSchema(other, "intersection right")
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file error.ts
|
|
3
|
+
* @brief TypeSea assertion error.
|
|
4
|
+
*/
|
|
5
|
+
import type { Issue } from "../issue/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief type sea assertion error.
|
|
8
|
+
* @details Owns its state directly; methods expose receiver checks and explicit result flow.
|
|
9
|
+
* @invariant Construction leaves the instance in a fully usable state before it escapes.
|
|
10
|
+
*/
|
|
11
|
+
export declare class TypeSeaAssertionError extends Error {
|
|
12
|
+
readonly issues: readonly Issue[];
|
|
13
|
+
/**
|
|
14
|
+
* @brief constructor.
|
|
15
|
+
* @post The receiver is initialized according to the class invariant before it can be observed.
|
|
16
|
+
*/
|
|
17
|
+
constructor(issues: readonly Issue[]);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/guard/error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAI/C;;;;GAIG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,SAAwB,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAEjD;;;OAGG;gBACgB,MAAM,EAAE,SAAS,KAAK,EAAE;CAK5C"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file error.ts
|
|
3
|
+
* @brief TypeSea assertion error.
|
|
4
|
+
*/
|
|
5
|
+
import { copyIssueArray } from "../issue/index.js";
|
|
6
|
+
import { defineReadonlyProperty } from "./props.js";
|
|
7
|
+
/**
|
|
8
|
+
* @brief type sea assertion error.
|
|
9
|
+
* @details Owns its state directly; methods expose receiver checks and explicit result flow.
|
|
10
|
+
* @invariant Construction leaves the instance in a fully usable state before it escapes.
|
|
11
|
+
*/
|
|
12
|
+
export class TypeSeaAssertionError extends Error {
|
|
13
|
+
/**
|
|
14
|
+
* @brief constructor.
|
|
15
|
+
* @post The receiver is initialized according to the class invariant before it can be observed.
|
|
16
|
+
*/
|
|
17
|
+
constructor(issues) {
|
|
18
|
+
super("TypeSea assertion failed");
|
|
19
|
+
this.name = "TypeSeaAssertionError";
|
|
20
|
+
defineReadonlyProperty(this, "issues", copyIssueArray(issues), true);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file index.ts
|
|
3
|
+
* @brief Public guard module aggregation.
|
|
4
|
+
*/
|
|
5
|
+
export { BaseGuard } from "./base.js";
|
|
6
|
+
export { TypeSeaAssertionError } from "./error.js";
|
|
7
|
+
export { NumberGuard } from "./number.js";
|
|
8
|
+
export { StringGuard } from "./string.js";
|
|
9
|
+
export type { Brand, Guard, GuardPresence, GuardValue, Infer, Presence, RuntimeValue } from "./types.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guard/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EACV,KAAK,EACL,KAAK,EACL,aAAa,EACb,UAAU,EACV,KAAK,EACL,QAAQ,EACR,YAAY,EACb,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file number.ts
|
|
3
|
+
* @brief Number guard implementation.
|
|
4
|
+
*/
|
|
5
|
+
import type { NumberSchema } from "../schema/index.js";
|
|
6
|
+
import { BaseGuard } from "./base.js";
|
|
7
|
+
import type { Presence } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* @brief number guard.
|
|
10
|
+
* @details Owns its state directly; methods expose receiver checks and explicit result flow.
|
|
11
|
+
* @invariant Construction leaves the instance in a fully usable state before it escapes.
|
|
12
|
+
*/
|
|
13
|
+
export declare class NumberGuard<TPresence extends Presence = "required"> extends BaseGuard<number, TPresence> {
|
|
14
|
+
/**
|
|
15
|
+
* @brief constructor.
|
|
16
|
+
* @post The receiver is initialized according to the class invariant before it can be observed.
|
|
17
|
+
*/
|
|
18
|
+
constructor(schema: NumberSchema);
|
|
19
|
+
/**
|
|
20
|
+
* @brief int.
|
|
21
|
+
*/
|
|
22
|
+
int(): NumberGuard<TPresence>;
|
|
23
|
+
/**
|
|
24
|
+
* @brief gte.
|
|
25
|
+
*/
|
|
26
|
+
gte(value: number): NumberGuard<TPresence>;
|
|
27
|
+
/**
|
|
28
|
+
* @brief lte.
|
|
29
|
+
*/
|
|
30
|
+
lte(value: number): NumberGuard<TPresence>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=number.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/guard/number.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAMtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;GAIG;AACH,qBAAa,WAAW,CACtB,SAAS,SAAS,QAAQ,GAAG,UAAU,CACvC,SAAQ,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC;IAEpC;;;OAGG;gBACgB,MAAM,EAAE,YAAY;IAKvC;;WAEO;IACA,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC;IAapC;;aAES;IACF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC;IAejD;;aAES;IACF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC;CAclD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file number.ts
|
|
3
|
+
* @brief Number guard implementation.
|
|
4
|
+
*/
|
|
5
|
+
import { NumberCheckTag, SchemaTag } from "../kind/index.js";
|
|
6
|
+
import { BaseGuard } from "./base.js";
|
|
7
|
+
import { checkFiniteNumberBound, readNumberConstructorSchema, readNumberMethodSchema } from "./read.js";
|
|
8
|
+
/**
|
|
9
|
+
* @brief number guard.
|
|
10
|
+
* @details Owns its state directly; methods expose receiver checks and explicit result flow.
|
|
11
|
+
* @invariant Construction leaves the instance in a fully usable state before it escapes.
|
|
12
|
+
*/
|
|
13
|
+
export class NumberGuard extends BaseGuard {
|
|
14
|
+
/**
|
|
15
|
+
* @brief constructor.
|
|
16
|
+
* @post The receiver is initialized according to the class invariant before it can be observed.
|
|
17
|
+
*/
|
|
18
|
+
constructor(schema) {
|
|
19
|
+
super(readNumberConstructorSchema(schema));
|
|
20
|
+
Object.freeze(this);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* @brief int.
|
|
24
|
+
*/
|
|
25
|
+
int() {
|
|
26
|
+
const schema = readNumberMethodSchema(this, "number int receiver");
|
|
27
|
+
return new NumberGuard({
|
|
28
|
+
tag: SchemaTag.Number,
|
|
29
|
+
checks: [
|
|
30
|
+
...schema.checks,
|
|
31
|
+
{
|
|
32
|
+
tag: NumberCheckTag.Integer
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @brief gte.
|
|
39
|
+
*/
|
|
40
|
+
gte(value) {
|
|
41
|
+
const schema = readNumberMethodSchema(this, "number gte receiver");
|
|
42
|
+
const bound = checkFiniteNumberBound(value, "gte");
|
|
43
|
+
return new NumberGuard({
|
|
44
|
+
tag: SchemaTag.Number,
|
|
45
|
+
checks: [
|
|
46
|
+
...schema.checks,
|
|
47
|
+
{
|
|
48
|
+
tag: NumberCheckTag.Gte,
|
|
49
|
+
value: bound
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* @brief lte.
|
|
56
|
+
*/
|
|
57
|
+
lte(value) {
|
|
58
|
+
const schema = readNumberMethodSchema(this, "number lte receiver");
|
|
59
|
+
const bound = checkFiniteNumberBound(value, "lte");
|
|
60
|
+
return new NumberGuard({
|
|
61
|
+
tag: SchemaTag.Number,
|
|
62
|
+
checks: [
|
|
63
|
+
...schema.checks,
|
|
64
|
+
{
|
|
65
|
+
tag: NumberCheckTag.Lte,
|
|
66
|
+
value: bound
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file props.ts
|
|
3
|
+
* @brief Guard object shape helpers.
|
|
4
|
+
*/
|
|
5
|
+
export declare function defineReadonlyProperty(target: object, key: string, value: unknown, enumerable: boolean): void;
|
|
6
|
+
/**
|
|
7
|
+
* @brief is strict true.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isStrictTrue(value: unknown): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* @brief is record.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isRecord(value: unknown): value is Readonly<Record<string, unknown>>;
|
|
14
|
+
/**
|
|
15
|
+
* @brief is plain reg exp.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isPlainRegExp(value: unknown): value is RegExp;
|
|
18
|
+
//# sourceMappingURL=props.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../../src/guard/props.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,OAAO,GAClB,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAEnF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAO7D"}
|