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,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file rewrite.ts
|
|
3
|
+
* @brief Node dependency rewrite utilities.
|
|
4
|
+
*/
|
|
5
|
+
import { mapNodeIds } from "./map-node.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief rewrite node deps.
|
|
8
|
+
* @details Resolves dependency aliases while preserving the node's own id.
|
|
9
|
+
* @param node Borrowed graph node to rewrite.
|
|
10
|
+
* @param aliases Borrowed alias table produced by the folding pass.
|
|
11
|
+
* @returns Graph node with dependency ids rewritten through the alias table.
|
|
12
|
+
*/
|
|
13
|
+
export function rewriteNodeDeps(node, aliases) {
|
|
14
|
+
return mapNodeIds(node, (value) => resolveAlias(value, aliases), node.id);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* @brief resolve alias.
|
|
18
|
+
* @details Follows an alias chain until it reaches a stable node id.
|
|
19
|
+
* @param value Borrowed node id to resolve.
|
|
20
|
+
* @param aliases Borrowed alias table.
|
|
21
|
+
* @returns Canonical node id for the current folding pass.
|
|
22
|
+
*/
|
|
23
|
+
export function resolveAlias(value, aliases) {
|
|
24
|
+
let current = value;
|
|
25
|
+
let next = aliases[current];
|
|
26
|
+
while (next !== undefined && next !== current) {
|
|
27
|
+
current = next;
|
|
28
|
+
next = aliases[current];
|
|
29
|
+
}
|
|
30
|
+
if (next === undefined) {
|
|
31
|
+
throw new Error("Graph alias points outside graph");
|
|
32
|
+
}
|
|
33
|
+
return current;
|
|
34
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file cache.ts
|
|
3
|
+
* @brief Validation plan cache.
|
|
4
|
+
*/
|
|
5
|
+
import type { Schema } from "../schema/index.js";
|
|
6
|
+
import type { ValidationPlan } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* @brief make validation plan.
|
|
9
|
+
* @details Lowers a schema into Sea-of-Nodes IR, runs the optimizer, and caches
|
|
10
|
+
* the resulting graph for all runtime users of the schema.
|
|
11
|
+
* @returns Cached or freshly built validation plan for the schema identity.
|
|
12
|
+
*/
|
|
13
|
+
export declare function makeValidationPlan(schema: Schema): ValidationPlan;
|
|
14
|
+
/**
|
|
15
|
+
* @brief schema requires tracking.
|
|
16
|
+
* @details Returns true only for schemas that can recurse through `lazy`.
|
|
17
|
+
* @returns True when active schema/value pair tracking is required.
|
|
18
|
+
*/
|
|
19
|
+
export declare function schemaRequiresTracking(schema: Schema): boolean;
|
|
20
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/plan/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgBjD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAYjE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQ9D"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file cache.ts
|
|
3
|
+
* @brief Validation plan cache.
|
|
4
|
+
*/
|
|
5
|
+
import { lowerSchema } from "../lower/index.js";
|
|
6
|
+
import { SchemaTag } from "../kind/index.js";
|
|
7
|
+
import { optimizeGraph } from "../optimize/index.js";
|
|
8
|
+
/**
|
|
9
|
+
* @brief plan cache.
|
|
10
|
+
* @details Weakly keys plans by immutable schema identity without extending schema lifetime.
|
|
11
|
+
* @invariant A cached plan always belongs to the exact schema object used as the key.
|
|
12
|
+
*/
|
|
13
|
+
const planCache = new WeakMap();
|
|
14
|
+
/**
|
|
15
|
+
* @brief tracking cache.
|
|
16
|
+
* @details Stores whether a schema can re-enter itself through lazy recursion.
|
|
17
|
+
* @invariant `true` means validation must use active schema/value pair tracking.
|
|
18
|
+
*/
|
|
19
|
+
const trackingCache = new WeakMap();
|
|
20
|
+
/**
|
|
21
|
+
* @brief make validation plan.
|
|
22
|
+
* @details Lowers a schema into Sea-of-Nodes IR, runs the optimizer, and caches
|
|
23
|
+
* the resulting graph for all runtime users of the schema.
|
|
24
|
+
* @returns Cached or freshly built validation plan for the schema identity.
|
|
25
|
+
*/
|
|
26
|
+
export function makeValidationPlan(schema) {
|
|
27
|
+
const cached = planCache.get(schema);
|
|
28
|
+
if (cached !== undefined) {
|
|
29
|
+
return cached;
|
|
30
|
+
}
|
|
31
|
+
const plan = Object.freeze({
|
|
32
|
+
schema,
|
|
33
|
+
graph: optimizeGraph(lowerSchema(schema)),
|
|
34
|
+
tracksRecursion: schemaRequiresTracking(schema)
|
|
35
|
+
});
|
|
36
|
+
planCache.set(schema, plan);
|
|
37
|
+
return plan;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* @brief schema requires tracking.
|
|
41
|
+
* @details Returns true only for schemas that can recurse through `lazy`.
|
|
42
|
+
* @returns True when active schema/value pair tracking is required.
|
|
43
|
+
*/
|
|
44
|
+
export function schemaRequiresTracking(schema) {
|
|
45
|
+
const cached = trackingCache.get(schema);
|
|
46
|
+
if (cached !== undefined) {
|
|
47
|
+
return cached;
|
|
48
|
+
}
|
|
49
|
+
const result = schemaRequiresTrackingInner(schema, new WeakSet());
|
|
50
|
+
trackingCache.set(schema, result);
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @brief schema requires tracking inner.
|
|
55
|
+
*/
|
|
56
|
+
function schemaRequiresTrackingInner(schema, seen) {
|
|
57
|
+
if (seen.has(schema)) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
seen.add(schema);
|
|
61
|
+
switch (schema.tag) {
|
|
62
|
+
case SchemaTag.Lazy:
|
|
63
|
+
return true;
|
|
64
|
+
case SchemaTag.Array:
|
|
65
|
+
return schemaRequiresTrackingInner(schema.item, seen);
|
|
66
|
+
case SchemaTag.Tuple:
|
|
67
|
+
return schemaArrayRequiresTracking(schema.items, seen);
|
|
68
|
+
case SchemaTag.Record:
|
|
69
|
+
return schemaRequiresTrackingInner(schema.value, seen);
|
|
70
|
+
case SchemaTag.Object:
|
|
71
|
+
for (let index = 0; index < schema.entries.length; index += 1) {
|
|
72
|
+
const entry = schema.entries[index];
|
|
73
|
+
if (entry !== undefined &&
|
|
74
|
+
schemaRequiresTrackingInner(entry.schema, seen)) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
case SchemaTag.Union:
|
|
80
|
+
return schemaArrayRequiresTracking(schema.options, seen);
|
|
81
|
+
case SchemaTag.Intersection:
|
|
82
|
+
return schemaRequiresTrackingInner(schema.left, seen) ||
|
|
83
|
+
schemaRequiresTrackingInner(schema.right, seen);
|
|
84
|
+
case SchemaTag.Optional:
|
|
85
|
+
case SchemaTag.Undefinedable:
|
|
86
|
+
case SchemaTag.Nullable:
|
|
87
|
+
case SchemaTag.Brand:
|
|
88
|
+
return schemaRequiresTrackingInner(schema.inner, seen);
|
|
89
|
+
case SchemaTag.DiscriminatedUnion:
|
|
90
|
+
for (let index = 0; index < schema.cases.length; index += 1) {
|
|
91
|
+
const unionCase = schema.cases[index];
|
|
92
|
+
if (unionCase !== undefined &&
|
|
93
|
+
schemaRequiresTrackingInner(unionCase.schema, seen)) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
case SchemaTag.Refine:
|
|
99
|
+
return schemaRequiresTrackingInner(schema.inner, seen);
|
|
100
|
+
case SchemaTag.Unknown:
|
|
101
|
+
case SchemaTag.Never:
|
|
102
|
+
case SchemaTag.String:
|
|
103
|
+
case SchemaTag.Number:
|
|
104
|
+
case SchemaTag.BigInt:
|
|
105
|
+
case SchemaTag.Symbol:
|
|
106
|
+
case SchemaTag.Boolean:
|
|
107
|
+
case SchemaTag.Literal:
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* @brief schema array requires tracking.
|
|
113
|
+
*/
|
|
114
|
+
function schemaArrayRequiresTracking(schemas, seen) {
|
|
115
|
+
for (let index = 0; index < schemas.length; index += 1) {
|
|
116
|
+
const schema = schemas[index];
|
|
117
|
+
if (schema !== undefined && schemaRequiresTrackingInner(schema, seen)) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file index.ts
|
|
3
|
+
* @brief Validation plan module aggregation.
|
|
4
|
+
*/
|
|
5
|
+
export { makeValidationPlan, schemaRequiresTracking } from "./cache.js";
|
|
6
|
+
export { executeGraphPredicate, executeSchemaPredicate, executeSchemaPredicateWithState } from "./predicate.js";
|
|
7
|
+
export type { ValidationPlan } from "./types.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plan/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,+BAA+B,EAChC,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file predicate.ts
|
|
3
|
+
* @brief Sea-of-Nodes predicate executor.
|
|
4
|
+
*/
|
|
5
|
+
import type { Graph } from "../ir/index.js";
|
|
6
|
+
import { type Schema } from "../schema/index.js";
|
|
7
|
+
import { type ValidationState } from "../evaluate/state.js";
|
|
8
|
+
/**
|
|
9
|
+
* @brief execute schema predicate.
|
|
10
|
+
* @details Runs one schema through its optimized Sea-of-Nodes validation plan.
|
|
11
|
+
* Dynamic schemas are resolved only at explicit lazy/refinement boundaries.
|
|
12
|
+
* @returns True when the value satisfies the schema.
|
|
13
|
+
*/
|
|
14
|
+
export declare function executeSchemaPredicate(schema: Schema, value: unknown): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* @brief execute schema predicate with state.
|
|
17
|
+
* @details Shares recursion accounting and cycle detection across nested IR nodes.
|
|
18
|
+
* @returns True when the value satisfies the schema under the borrowed state.
|
|
19
|
+
*/
|
|
20
|
+
export declare function executeSchemaPredicateWithState(schema: Schema, value: unknown, state: ValidationState): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* @brief execute graph predicate.
|
|
23
|
+
* @details Executes a frozen graph with one input value.
|
|
24
|
+
* @returns Boolean value held by the graph return node.
|
|
25
|
+
*/
|
|
26
|
+
export declare function executeGraphPredicate(graph: Graph, value: unknown, state: ValidationState): boolean;
|
|
27
|
+
//# sourceMappingURL=predicate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predicate.d.ts","sourceRoot":"","sources":["../../src/plan/predicate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,KAAK,EAGN,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,KAAK,MAAM,EACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAI9B;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAET;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,eAAe,GACrB,OAAO,CAcT;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,eAAe,GACrB,OAAO,CAaT"}
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file predicate.ts
|
|
3
|
+
* @brief Sea-of-Nodes predicate executor.
|
|
4
|
+
*/
|
|
5
|
+
import { NodeTag, SchemaTag } from "../kind/index.js";
|
|
6
|
+
import { resolveLazySchema } from "../schema/index.js";
|
|
7
|
+
import { enterValidation, leaveValidation, makeValidationState } from "../evaluate/state.js";
|
|
8
|
+
import { makeValidationPlan, schemaRequiresTracking } from "./cache.js";
|
|
9
|
+
import { executeSchemaKernel } from "./schema-predicate.js";
|
|
10
|
+
/**
|
|
11
|
+
* @brief execute schema predicate.
|
|
12
|
+
* @details Runs one schema through its optimized Sea-of-Nodes validation plan.
|
|
13
|
+
* Dynamic schemas are resolved only at explicit lazy/refinement boundaries.
|
|
14
|
+
* @returns True when the value satisfies the schema.
|
|
15
|
+
*/
|
|
16
|
+
export function executeSchemaPredicate(schema, value) {
|
|
17
|
+
return executeSchemaPredicateWithState(schema, value, makeValidationState());
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @brief execute schema predicate with state.
|
|
21
|
+
* @details Shares recursion accounting and cycle detection across nested IR nodes.
|
|
22
|
+
* @returns True when the value satisfies the schema under the borrowed state.
|
|
23
|
+
*/
|
|
24
|
+
export function executeSchemaPredicateWithState(schema, value, state) {
|
|
25
|
+
if (!schemaRequiresTracking(schema)) {
|
|
26
|
+
return executeSchemaPredicateInner(schema, value, state);
|
|
27
|
+
}
|
|
28
|
+
const entered = enterValidation(schema, value, state);
|
|
29
|
+
if (entered === "cycle") {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
if (entered === "budget") {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
const result = executeSchemaPredicateInner(schema, value, state);
|
|
36
|
+
leaveValidation(schema, value, state);
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* @brief execute graph predicate.
|
|
41
|
+
* @details Executes a frozen graph with one input value.
|
|
42
|
+
* @returns Boolean value held by the graph return node.
|
|
43
|
+
*/
|
|
44
|
+
export function executeGraphPredicate(graph, value, state) {
|
|
45
|
+
const frame = acquireGraphFrame(state, graph.nodes.length);
|
|
46
|
+
const result = evaluateNode(graph, graph.result, value, frame.values, frame.seen, frame.epoch, state);
|
|
47
|
+
releaseGraphFrame(state);
|
|
48
|
+
return result === true;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* @brief execute schema predicate inner.
|
|
52
|
+
*/
|
|
53
|
+
function executeSchemaPredicateInner(schema, value, state) {
|
|
54
|
+
switch (schema.tag) {
|
|
55
|
+
case SchemaTag.Lazy:
|
|
56
|
+
return executeSchemaPredicateWithState(resolveLazySchema(schema, state.resolving), value, state);
|
|
57
|
+
case SchemaTag.Refine:
|
|
58
|
+
return executeSchemaPredicateWithState(schema.inner, value, state) &&
|
|
59
|
+
isStrictTrue(schema.predicate(value));
|
|
60
|
+
default: {
|
|
61
|
+
makeValidationPlan(schema);
|
|
62
|
+
return executeSchemaKernel(schema, value, state, executeSchemaPredicateWithState);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* @brief evaluate node.
|
|
68
|
+
*/
|
|
69
|
+
function evaluateNode(graph, id, input, values, seen, epoch, state) {
|
|
70
|
+
if (seen[id] === epoch) {
|
|
71
|
+
return values[id];
|
|
72
|
+
}
|
|
73
|
+
const node = graph.nodes[id];
|
|
74
|
+
const result = node === undefined
|
|
75
|
+
? undefined
|
|
76
|
+
: evaluateGraphNode(graph, node, input, values, seen, epoch, state);
|
|
77
|
+
values[id] = result;
|
|
78
|
+
seen[id] = epoch;
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* @brief evaluate graph node.
|
|
83
|
+
*/
|
|
84
|
+
function evaluateGraphNode(graph, node, input, values, seen, epoch, state) {
|
|
85
|
+
switch (node.tag) {
|
|
86
|
+
case NodeTag.Start:
|
|
87
|
+
return true;
|
|
88
|
+
case NodeTag.Param:
|
|
89
|
+
return input;
|
|
90
|
+
case NodeTag.Const:
|
|
91
|
+
return node.value;
|
|
92
|
+
case NodeTag.GetProp:
|
|
93
|
+
return readOwnDataValue(evaluateNode(graph, node.object, input, values, seen, epoch, state), node.key);
|
|
94
|
+
case NodeTag.IsString:
|
|
95
|
+
return typeof evaluateNode(graph, node.value, input, values, seen, epoch, state) === "string";
|
|
96
|
+
case NodeTag.IsNumber:
|
|
97
|
+
return isFiniteNumber(evaluateNode(graph, node.value, input, values, seen, epoch, state));
|
|
98
|
+
case NodeTag.IsBoolean:
|
|
99
|
+
return typeof evaluateNode(graph, node.value, input, values, seen, epoch, state) === "boolean";
|
|
100
|
+
case NodeTag.IsBigInt:
|
|
101
|
+
return typeof evaluateNode(graph, node.value, input, values, seen, epoch, state) === "bigint";
|
|
102
|
+
case NodeTag.IsSymbol:
|
|
103
|
+
return typeof evaluateNode(graph, node.value, input, values, seen, epoch, state) === "symbol";
|
|
104
|
+
case NodeTag.IsObject:
|
|
105
|
+
return isPlainRecord(evaluateNode(graph, node.value, input, values, seen, epoch, state));
|
|
106
|
+
case NodeTag.IsArray:
|
|
107
|
+
return Array.isArray(evaluateNode(graph, node.value, input, values, seen, epoch, state));
|
|
108
|
+
case NodeTag.IsUndefined:
|
|
109
|
+
return evaluateNode(graph, node.value, input, values, seen, epoch, state) === undefined;
|
|
110
|
+
case NodeTag.IsNull:
|
|
111
|
+
return evaluateNode(graph, node.value, input, values, seen, epoch, state) === null;
|
|
112
|
+
case NodeTag.IsInteger:
|
|
113
|
+
return Number.isInteger(evaluateNode(graph, node.value, input, values, seen, epoch, state));
|
|
114
|
+
case NodeTag.Not:
|
|
115
|
+
return evaluateNode(graph, node.value, input, values, seen, epoch, state) !== true;
|
|
116
|
+
case NodeTag.Equals:
|
|
117
|
+
return Object.is(evaluateNode(graph, node.left, input, values, seen, epoch, state), evaluateNode(graph, node.right, input, values, seen, epoch, state));
|
|
118
|
+
case NodeTag.Gte:
|
|
119
|
+
return compareNumber(evaluateNode(graph, node.left, input, values, seen, epoch, state), evaluateNode(graph, node.right, input, values, seen, epoch, state), true);
|
|
120
|
+
case NodeTag.Lte:
|
|
121
|
+
return compareNumber(evaluateNode(graph, node.left, input, values, seen, epoch, state), evaluateNode(graph, node.right, input, values, seen, epoch, state), false);
|
|
122
|
+
case NodeTag.StringMin:
|
|
123
|
+
return testStringBound(evaluateNode(graph, node.value, input, values, seen, epoch, state), node.bound, true);
|
|
124
|
+
case NodeTag.StringMax:
|
|
125
|
+
return testStringBound(evaluateNode(graph, node.value, input, values, seen, epoch, state), node.bound, false);
|
|
126
|
+
case NodeTag.Regex:
|
|
127
|
+
return testRegex(evaluateNode(graph, node.value, input, values, seen, epoch, state), node.regex);
|
|
128
|
+
case NodeTag.HasOwn:
|
|
129
|
+
return hasOwnProperty(evaluateNode(graph, node.object, input, values, seen, epoch, state), node.key);
|
|
130
|
+
case NodeTag.HasOwnData:
|
|
131
|
+
return hasOwnDataProperty(evaluateNode(graph, node.object, input, values, seen, epoch, state), node.key);
|
|
132
|
+
case NodeTag.StrictKeys:
|
|
133
|
+
return testStrictKeys(evaluateNode(graph, node.object, input, values, seen, epoch, state), node.keys);
|
|
134
|
+
case NodeTag.ArrayEvery:
|
|
135
|
+
return testArrayEvery(evaluateNode(graph, node.value, input, values, seen, epoch, state), node.item, state);
|
|
136
|
+
case NodeTag.TupleItems:
|
|
137
|
+
return testTupleItems(evaluateNode(graph, node.value, input, values, seen, epoch, state), node.items, state);
|
|
138
|
+
case NodeTag.RecordEvery:
|
|
139
|
+
return testRecordEvery(evaluateNode(graph, node.value, input, values, seen, epoch, state), node.item, state);
|
|
140
|
+
case NodeTag.DiscriminantDispatch:
|
|
141
|
+
return testDiscriminantDispatch(evaluateNode(graph, node.value, input, values, seen, epoch, state), node.key, node.schemas, node.lookup, state);
|
|
142
|
+
case NodeTag.SchemaCheck:
|
|
143
|
+
return executeSchemaPredicateWithState(node.schema, evaluateNode(graph, node.value, input, values, seen, epoch, state), state);
|
|
144
|
+
case NodeTag.And:
|
|
145
|
+
return evaluateAnd(graph, node.values, input, values, seen, epoch, state);
|
|
146
|
+
case NodeTag.Or:
|
|
147
|
+
return evaluateOr(graph, node.values, input, values, seen, epoch, state);
|
|
148
|
+
case NodeTag.Return:
|
|
149
|
+
return evaluateNode(graph, node.value, input, values, seen, epoch, state);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* @brief evaluate and.
|
|
154
|
+
*/
|
|
155
|
+
function evaluateAnd(graph, ids, input, values, seen, epoch, state) {
|
|
156
|
+
for (let index = 0; index < ids.length; index += 1) {
|
|
157
|
+
const id = ids[index];
|
|
158
|
+
if (id === undefined ||
|
|
159
|
+
evaluateNode(graph, id, input, values, seen, epoch, state) !== true) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* @brief evaluate or.
|
|
167
|
+
*/
|
|
168
|
+
function evaluateOr(graph, ids, input, values, seen, epoch, state) {
|
|
169
|
+
for (let index = 0; index < ids.length; index += 1) {
|
|
170
|
+
const id = ids[index];
|
|
171
|
+
if (id !== undefined &&
|
|
172
|
+
evaluateNode(graph, id, input, values, seen, epoch, state) === true) {
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* @brief test array every.
|
|
180
|
+
*/
|
|
181
|
+
function testArrayEvery(value, item, state) {
|
|
182
|
+
if (!Array.isArray(value)) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
186
|
+
const slot = readArrayIndexValue(value, index);
|
|
187
|
+
if (slot.accessor ||
|
|
188
|
+
!executeSchemaPredicateWithState(item, slot.value, state)) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* @brief test tuple items.
|
|
196
|
+
*/
|
|
197
|
+
function testTupleItems(value, items, state) {
|
|
198
|
+
if (!Array.isArray(value) || value.length !== items.length) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
for (let index = 0; index < items.length; index += 1) {
|
|
202
|
+
const item = items[index];
|
|
203
|
+
if (item === undefined) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
const slot = readArrayIndexValue(value, index);
|
|
207
|
+
if (slot.accessor ||
|
|
208
|
+
!executeSchemaPredicateWithState(item, slot.value, state)) {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* @brief test record every.
|
|
216
|
+
*/
|
|
217
|
+
function testRecordEvery(value, item, state) {
|
|
218
|
+
if (!isPlainRecord(value)) {
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
const keys = Object.keys(value);
|
|
222
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
223
|
+
const key = keys[index];
|
|
224
|
+
if (key === undefined) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
228
|
+
if (descriptor === undefined ||
|
|
229
|
+
!Object.prototype.hasOwnProperty.call(descriptor, "value") ||
|
|
230
|
+
!executeSchemaPredicateWithState(item, descriptor.value, state)) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* @brief test discriminant dispatch.
|
|
238
|
+
*/
|
|
239
|
+
function testDiscriminantDispatch(value, key, schemas, lookup, state) {
|
|
240
|
+
if (!isPlainRecord(value)) {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
244
|
+
if (descriptor === undefined ||
|
|
245
|
+
!Object.prototype.hasOwnProperty.call(descriptor, "value") ||
|
|
246
|
+
typeof descriptor.value !== "string") {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
const index = Object.prototype.hasOwnProperty.call(lookup, descriptor.value)
|
|
250
|
+
? lookup[descriptor.value]
|
|
251
|
+
: undefined;
|
|
252
|
+
if (index === undefined) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
const schema = schemas[index];
|
|
256
|
+
return schema !== undefined &&
|
|
257
|
+
executeSchemaPredicateWithState(schema, value, state);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* @brief read array index value.
|
|
261
|
+
*/
|
|
262
|
+
function readArrayIndexValue(value, index) {
|
|
263
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
264
|
+
if (descriptor === undefined) {
|
|
265
|
+
return {
|
|
266
|
+
accessor: false,
|
|
267
|
+
value: undefined
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
if (!Object.prototype.hasOwnProperty.call(descriptor, "value")) {
|
|
271
|
+
return {
|
|
272
|
+
accessor: true,
|
|
273
|
+
value: undefined
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
accessor: false,
|
|
278
|
+
value: descriptor.value
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* @brief read own data value.
|
|
283
|
+
*/
|
|
284
|
+
function readOwnDataValue(value, key) {
|
|
285
|
+
if (!isPropertyHost(value)) {
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
289
|
+
if (descriptor === undefined ||
|
|
290
|
+
!Object.prototype.hasOwnProperty.call(descriptor, "value")) {
|
|
291
|
+
return undefined;
|
|
292
|
+
}
|
|
293
|
+
return descriptor.value;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* @brief has own property.
|
|
297
|
+
*/
|
|
298
|
+
function hasOwnProperty(value, key) {
|
|
299
|
+
return isPropertyHost(value) &&
|
|
300
|
+
Object.prototype.hasOwnProperty.call(value, key);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* @brief has own data property.
|
|
304
|
+
*/
|
|
305
|
+
function hasOwnDataProperty(value, key) {
|
|
306
|
+
if (!isPropertyHost(value)) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
310
|
+
return descriptor !== undefined &&
|
|
311
|
+
Object.prototype.hasOwnProperty.call(descriptor, "value");
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* @brief test strict keys.
|
|
315
|
+
*/
|
|
316
|
+
function testStrictKeys(value, keys) {
|
|
317
|
+
if (!isPlainRecord(value)) {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
const present = Reflect.ownKeys(value);
|
|
321
|
+
for (let index = 0; index < present.length; index += 1) {
|
|
322
|
+
const key = present[index];
|
|
323
|
+
if (typeof key !== "string" || !keys.includes(key)) {
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* @brief compare number.
|
|
331
|
+
*/
|
|
332
|
+
function compareNumber(left, right, gte) {
|
|
333
|
+
if (typeof left !== "number" || typeof right !== "number") {
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
return gte ? left >= right : left <= right;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* @brief test string bound.
|
|
340
|
+
*/
|
|
341
|
+
function testStringBound(value, bound, min) {
|
|
342
|
+
if (typeof value !== "string") {
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
return min ? value.length >= bound : value.length <= bound;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* @brief test regex.
|
|
349
|
+
*/
|
|
350
|
+
function testRegex(value, regex) {
|
|
351
|
+
if (typeof value !== "string") {
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
regex.lastIndex = 0;
|
|
355
|
+
const result = regex.test(value);
|
|
356
|
+
regex.lastIndex = 0;
|
|
357
|
+
return result;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* @brief is finite number.
|
|
361
|
+
*/
|
|
362
|
+
function isFiniteNumber(value) {
|
|
363
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* @brief is plain record.
|
|
367
|
+
*/
|
|
368
|
+
function isPlainRecord(value) {
|
|
369
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* @brief is property host.
|
|
373
|
+
*/
|
|
374
|
+
function isPropertyHost(value) {
|
|
375
|
+
return (typeof value === "object" && value !== null) || typeof value === "function";
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* @brief acquire graph frame.
|
|
379
|
+
*/
|
|
380
|
+
function acquireGraphFrame(state, nodeCount) {
|
|
381
|
+
const index = state.graphDepth;
|
|
382
|
+
state.graphDepth = index + 1;
|
|
383
|
+
let frame = state.graphFrames[index];
|
|
384
|
+
if (frame === undefined) {
|
|
385
|
+
frame = {
|
|
386
|
+
values: new Array(nodeCount),
|
|
387
|
+
seen: new Uint32Array(nodeCount),
|
|
388
|
+
epoch: 0
|
|
389
|
+
};
|
|
390
|
+
state.graphFrames[index] = frame;
|
|
391
|
+
}
|
|
392
|
+
else if (frame.seen.length < nodeCount) {
|
|
393
|
+
frame.values = new Array(nodeCount);
|
|
394
|
+
frame.seen = new Uint32Array(nodeCount);
|
|
395
|
+
frame.epoch = 0;
|
|
396
|
+
}
|
|
397
|
+
frame.epoch += 1;
|
|
398
|
+
if (frame.epoch === 0) {
|
|
399
|
+
frame.seen.fill(0);
|
|
400
|
+
frame.epoch = 1;
|
|
401
|
+
}
|
|
402
|
+
return frame;
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* @brief release graph frame.
|
|
406
|
+
*/
|
|
407
|
+
function releaseGraphFrame(state) {
|
|
408
|
+
state.graphDepth -= 1;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* @brief is strict true.
|
|
412
|
+
*/
|
|
413
|
+
function isStrictTrue(value) {
|
|
414
|
+
return value === true;
|
|
415
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema-predicate.ts
|
|
3
|
+
* @brief Schema-specialized predicate kernels for validation plans.
|
|
4
|
+
*/
|
|
5
|
+
import { type Schema } from "../schema/index.js";
|
|
6
|
+
import type { ValidationState } from "../evaluate/state.js";
|
|
7
|
+
/**
|
|
8
|
+
* @brief child predicate runner.
|
|
9
|
+
*/
|
|
10
|
+
export type ChildPredicateRunner = (schema: Schema, value: unknown, state: ValidationState) => boolean;
|
|
11
|
+
/**
|
|
12
|
+
* @brief execute schema kernel.
|
|
13
|
+
*/
|
|
14
|
+
export declare function executeSchemaKernel(schema: Schema, value: unknown, state: ValidationState, runChild: ChildPredicateRunner): boolean;
|
|
15
|
+
//# sourceMappingURL=schema-predicate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-predicate.d.ts","sourceRoot":"","sources":["../../src/plan/schema-predicate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAIL,KAAK,MAAM,EACZ,MAAM,oBAAoB,CAAC;AAS5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,eAAe,KACnB,OAAO,CAAC;AAEb;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAoDT"}
|