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,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema-predicate.ts
|
|
3
|
+
* @brief Schema-specialized predicate kernels for validation plans.
|
|
4
|
+
*/
|
|
5
|
+
import { NumberCheckTag, ObjectModeTag, PresenceTag, SchemaTag, StringCheckTag } from "../kind/index.js";
|
|
6
|
+
import { UUID_PATTERN, resolveLazySchema } from "../schema/index.js";
|
|
7
|
+
import { findDiscriminatedUnionCase, hasObjectKey, isDataPropertyDescriptor, isPlainRecord, readOwnDataProperty } from "../evaluate/shared.js";
|
|
8
|
+
/**
|
|
9
|
+
* @brief execute schema kernel.
|
|
10
|
+
*/
|
|
11
|
+
export function executeSchemaKernel(schema, value, state, runChild) {
|
|
12
|
+
switch (schema.tag) {
|
|
13
|
+
case SchemaTag.Unknown:
|
|
14
|
+
return true;
|
|
15
|
+
case SchemaTag.Never:
|
|
16
|
+
return false;
|
|
17
|
+
case SchemaTag.String:
|
|
18
|
+
return isStringSchema(schema, value);
|
|
19
|
+
case SchemaTag.Number:
|
|
20
|
+
return isNumberSchema(schema, value);
|
|
21
|
+
case SchemaTag.BigInt:
|
|
22
|
+
return typeof value === "bigint";
|
|
23
|
+
case SchemaTag.Symbol:
|
|
24
|
+
return typeof value === "symbol";
|
|
25
|
+
case SchemaTag.Boolean:
|
|
26
|
+
return typeof value === "boolean";
|
|
27
|
+
case SchemaTag.Literal:
|
|
28
|
+
return Object.is(value, schema.value);
|
|
29
|
+
case SchemaTag.Array:
|
|
30
|
+
return isArraySchema(schema.item, value, state, runChild);
|
|
31
|
+
case SchemaTag.Tuple:
|
|
32
|
+
return isTupleSchema(schema.items, value, state, runChild);
|
|
33
|
+
case SchemaTag.Record:
|
|
34
|
+
return isRecordSchema(schema.value, value, state, runChild);
|
|
35
|
+
case SchemaTag.Object:
|
|
36
|
+
return isObjectSchema(schema, value, state, runChild);
|
|
37
|
+
case SchemaTag.Union:
|
|
38
|
+
return isUnionSchema(schema.options, value, state, runChild);
|
|
39
|
+
case SchemaTag.Intersection:
|
|
40
|
+
return runChild(schema.left, value, state) &&
|
|
41
|
+
runChild(schema.right, value, state);
|
|
42
|
+
case SchemaTag.Optional:
|
|
43
|
+
case SchemaTag.Undefinedable:
|
|
44
|
+
return value === undefined || runChild(schema.inner, value, state);
|
|
45
|
+
case SchemaTag.Nullable:
|
|
46
|
+
return value === null || runChild(schema.inner, value, state);
|
|
47
|
+
case SchemaTag.DiscriminatedUnion:
|
|
48
|
+
return isDiscriminatedUnionSchema(schema.key, schema.cases, value, state, runChild);
|
|
49
|
+
case SchemaTag.Brand:
|
|
50
|
+
return runChild(schema.inner, value, state);
|
|
51
|
+
case SchemaTag.Lazy:
|
|
52
|
+
return runChild(resolveLazySchema(schema, state.resolving), value, state);
|
|
53
|
+
case SchemaTag.Refine:
|
|
54
|
+
return runChild(schema.inner, value, state) &&
|
|
55
|
+
isStrictTrue(schema.predicate(value));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* @brief is string schema.
|
|
60
|
+
*/
|
|
61
|
+
function isStringSchema(schema, value) {
|
|
62
|
+
if (typeof value !== "string") {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const checks = schema.checks;
|
|
66
|
+
for (let index = 0; index < checks.length; index += 1) {
|
|
67
|
+
const check = checks[index];
|
|
68
|
+
if (check === undefined) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
switch (check.tag) {
|
|
72
|
+
case StringCheckTag.Min:
|
|
73
|
+
if (value.length < check.value) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
break;
|
|
77
|
+
case StringCheckTag.Max:
|
|
78
|
+
if (value.length > check.value) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
case StringCheckTag.Regex:
|
|
83
|
+
check.regex.lastIndex = 0;
|
|
84
|
+
if (!check.regex.test(value)) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
check.regex.lastIndex = 0;
|
|
88
|
+
break;
|
|
89
|
+
case StringCheckTag.Uuid:
|
|
90
|
+
UUID_PATTERN.lastIndex = 0;
|
|
91
|
+
if (!UUID_PATTERN.test(value)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
UUID_PATTERN.lastIndex = 0;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* @brief is number schema.
|
|
102
|
+
*/
|
|
103
|
+
function isNumberSchema(schema, value) {
|
|
104
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
const checks = schema.checks;
|
|
108
|
+
for (let index = 0; index < checks.length; index += 1) {
|
|
109
|
+
const check = checks[index];
|
|
110
|
+
if (check === undefined) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
switch (check.tag) {
|
|
114
|
+
case NumberCheckTag.Integer:
|
|
115
|
+
if (!Number.isInteger(value)) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
break;
|
|
119
|
+
case NumberCheckTag.Gte:
|
|
120
|
+
if (value < check.value) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
break;
|
|
124
|
+
case NumberCheckTag.Lte:
|
|
125
|
+
if (value > check.value) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* @brief is array schema.
|
|
135
|
+
*/
|
|
136
|
+
function isArraySchema(item, value, state, runChild) {
|
|
137
|
+
if (!Array.isArray(value)) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
141
|
+
const property = readArrayIndexDataProperty(value, index);
|
|
142
|
+
if (property === null ||
|
|
143
|
+
!runChild(item, property === undefined ? undefined : property.value, state)) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* @brief is tuple schema.
|
|
151
|
+
*/
|
|
152
|
+
function isTupleSchema(items, value, state, runChild) {
|
|
153
|
+
if (!Array.isArray(value) || value.length !== items.length) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
for (let index = 0; index < items.length; index += 1) {
|
|
157
|
+
const item = items[index];
|
|
158
|
+
const property = readArrayIndexDataProperty(value, index);
|
|
159
|
+
if (item === undefined ||
|
|
160
|
+
property === null ||
|
|
161
|
+
!runChild(item, property === undefined ? undefined : property.value, state)) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* @brief read array index data property.
|
|
169
|
+
*/
|
|
170
|
+
function readArrayIndexDataProperty(value, index) {
|
|
171
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
172
|
+
if (descriptor === undefined) {
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
if (!isDataPropertyDescriptor(descriptor)) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
return descriptor;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* @brief is record schema.
|
|
182
|
+
*/
|
|
183
|
+
function isRecordSchema(item, value, state, runChild) {
|
|
184
|
+
if (!isPlainRecord(value)) {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
const keys = Object.keys(value);
|
|
188
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
189
|
+
const key = keys[index];
|
|
190
|
+
if (key === undefined) {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
const property = readOwnDataProperty(value, key);
|
|
194
|
+
if (property === undefined || !runChild(item, property.value, state)) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* @brief is object schema.
|
|
202
|
+
*/
|
|
203
|
+
function isObjectSchema(schema, value, state, runChild) {
|
|
204
|
+
if (!isPlainRecord(value)) {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
const record = value;
|
|
208
|
+
const entries = schema.entries;
|
|
209
|
+
let allRequired = true;
|
|
210
|
+
for (let index = 0; index < entries.length; index += 1) {
|
|
211
|
+
const entry = entries[index];
|
|
212
|
+
if (entry === undefined) {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
if (entry.presence === PresenceTag.Optional) {
|
|
216
|
+
allRequired = false;
|
|
217
|
+
}
|
|
218
|
+
const property = readOwnDataProperty(record, entry.key);
|
|
219
|
+
if (property === undefined) {
|
|
220
|
+
if (entry.presence === PresenceTag.Optional &&
|
|
221
|
+
!Object.prototype.hasOwnProperty.call(record, entry.key)) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
if (!runChild(entry.schema, property.value, state)) {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (schema.mode === ObjectModeTag.Strict) {
|
|
231
|
+
if (allRequired) {
|
|
232
|
+
return Object.getOwnPropertyNames(record).length === entries.length &&
|
|
233
|
+
Object.getOwnPropertySymbols(record).length === 0;
|
|
234
|
+
}
|
|
235
|
+
const keys = Reflect.ownKeys(record);
|
|
236
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
237
|
+
const key = keys[index];
|
|
238
|
+
if (typeof key !== "string" || !hasObjectKey(schema.keyLookup, key)) {
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* @brief is union schema.
|
|
247
|
+
*/
|
|
248
|
+
function isUnionSchema(options, value, state, runChild) {
|
|
249
|
+
for (let index = 0; index < options.length; index += 1) {
|
|
250
|
+
const option = options[index];
|
|
251
|
+
if (option !== undefined && runChild(option, value, state)) {
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* @brief is discriminated union schema.
|
|
259
|
+
*/
|
|
260
|
+
function isDiscriminatedUnionSchema(key, cases, value, state, runChild) {
|
|
261
|
+
if (!isPlainRecord(value)) {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
const discriminantProperty = readOwnDataProperty(value, key);
|
|
265
|
+
if (discriminantProperty === undefined ||
|
|
266
|
+
typeof discriminantProperty.value !== "string") {
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
const selected = findDiscriminatedUnionCase(cases, discriminantProperty.value);
|
|
270
|
+
return selected !== undefined && runChild(selected, value, state);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* @brief is strict true.
|
|
274
|
+
*/
|
|
275
|
+
function isStrictTrue(value) {
|
|
276
|
+
return value === true;
|
|
277
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file types.ts
|
|
3
|
+
* @brief Optimized validation plan contracts.
|
|
4
|
+
*/
|
|
5
|
+
import type { Graph } from "../ir/index.js";
|
|
6
|
+
import type { Schema } from "../schema/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* @brief validation plan.
|
|
9
|
+
* @details Binds one immutable schema object to the optimized Sea-of-Nodes graph
|
|
10
|
+
* that is used by runtime boolean validation and generated predicate emission.
|
|
11
|
+
* @invariant The graph is already lowered, optimized, validated, and frozen.
|
|
12
|
+
*/
|
|
13
|
+
export interface ValidationPlan {
|
|
14
|
+
readonly schema: Schema;
|
|
15
|
+
readonly graph: Graph;
|
|
16
|
+
readonly tracksRecursion: boolean;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plan/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @brief result.
|
|
3
|
+
*/
|
|
4
|
+
export type Result<TValue, TError> = Ok<TValue> | Err<TError>;
|
|
5
|
+
/**
|
|
6
|
+
* @brief ok.
|
|
7
|
+
*/
|
|
8
|
+
export interface Ok<TValue> {
|
|
9
|
+
readonly ok: true;
|
|
10
|
+
readonly value: TValue;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* @brief err.
|
|
14
|
+
*/
|
|
15
|
+
export interface Err<TError> {
|
|
16
|
+
readonly ok: false;
|
|
17
|
+
readonly error: TError;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @brief ok.
|
|
21
|
+
*/
|
|
22
|
+
export declare function ok<TValue>(value: TValue): Result<TValue, never>;
|
|
23
|
+
/**
|
|
24
|
+
* @brief err.
|
|
25
|
+
*/
|
|
26
|
+
export declare function err<TError>(error: TError): Result<never, TError>;
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/result/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,IAC7B,EAAE,CAAC,MAAM,CAAC,GACV,GAAG,CAAC,MAAM,CAAC,CAAC;AAEhB;;GAEG;AACH,MAAM,WAAW,EAAE,CAAC,MAAM;IACxB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,GAAG,CAAC,MAAM;IACzB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAM/D;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAMhE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @brief ok.
|
|
3
|
+
*/
|
|
4
|
+
export function ok(value) {
|
|
5
|
+
const result = {
|
|
6
|
+
ok: true,
|
|
7
|
+
value
|
|
8
|
+
};
|
|
9
|
+
return Object.freeze(result);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* @brief err.
|
|
13
|
+
*/
|
|
14
|
+
export function err(error) {
|
|
15
|
+
const result = {
|
|
16
|
+
ok: false,
|
|
17
|
+
error
|
|
18
|
+
};
|
|
19
|
+
return Object.freeze(result);
|
|
20
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/common.ts
|
|
3
|
+
* @brief Private schema shape predicates.
|
|
4
|
+
*/
|
|
5
|
+
import type { ObjectKeyLookup } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief is record.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isRecord(value: unknown): value is Readonly<Record<string, unknown>>;
|
|
10
|
+
/**
|
|
11
|
+
* @brief is unknown array.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isUnknownArray(value: unknown): value is readonly unknown[];
|
|
14
|
+
/**
|
|
15
|
+
* @brief is plain reg exp.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isPlainRegExp(value: unknown): value is RegExp;
|
|
18
|
+
/**
|
|
19
|
+
* @brief is string array.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isStringArray(value: unknown): value is readonly string[];
|
|
22
|
+
/**
|
|
23
|
+
* @brief is object key lookup.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isObjectKeyLookup(value: unknown, keys: readonly string[]): value is ObjectKeyLookup;
|
|
26
|
+
/**
|
|
27
|
+
* @brief includes string.
|
|
28
|
+
*/
|
|
29
|
+
export declare function includesString(values: readonly string[], value: string): boolean;
|
|
30
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/schema/common.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKnF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,OAAO,EAAE,CAE1E;AAyBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAO7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,MAAM,EAAE,CAUxE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,KAAK,IAAI,eAAe,CAqB1B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAOhF"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/common.ts
|
|
3
|
+
* @brief Private schema shape predicates.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @brief is record.
|
|
7
|
+
*/
|
|
8
|
+
export function isRecord(value) {
|
|
9
|
+
return typeof value === "object" &&
|
|
10
|
+
value !== null &&
|
|
11
|
+
!Array.isArray(value) &&
|
|
12
|
+
hasOnlyDataProperties(value);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* @brief is unknown array.
|
|
16
|
+
*/
|
|
17
|
+
export function isUnknownArray(value) {
|
|
18
|
+
return Array.isArray(value) && hasOnlyDataProperties(value);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @brief has only data properties.
|
|
22
|
+
* @details Rejects accessor descriptors before schema internals read fields by key.
|
|
23
|
+
* @returns True when every own property is backed by a data slot.
|
|
24
|
+
*/
|
|
25
|
+
function hasOnlyDataProperties(value) {
|
|
26
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
27
|
+
const descriptorMap = descriptors;
|
|
28
|
+
const keys = Reflect.ownKeys(descriptors);
|
|
29
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
30
|
+
const key = keys[index];
|
|
31
|
+
if (key === undefined) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const descriptor = descriptorMap[key];
|
|
35
|
+
if (descriptor === undefined ||
|
|
36
|
+
!Object.prototype.hasOwnProperty.call(descriptor, "value")) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* @brief is plain reg exp.
|
|
44
|
+
*/
|
|
45
|
+
export function isPlainRegExp(value) {
|
|
46
|
+
return value instanceof RegExp &&
|
|
47
|
+
Object.getPrototypeOf(value) === RegExp.prototype &&
|
|
48
|
+
!Object.prototype.hasOwnProperty.call(value, "exec") &&
|
|
49
|
+
!Object.prototype.hasOwnProperty.call(value, "test") &&
|
|
50
|
+
!Object.prototype.hasOwnProperty.call(value, "source") &&
|
|
51
|
+
!Object.prototype.hasOwnProperty.call(value, "flags");
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @brief is string array.
|
|
55
|
+
*/
|
|
56
|
+
export function isStringArray(value) {
|
|
57
|
+
if (!isUnknownArray(value)) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
61
|
+
if (typeof value[index] !== "string") {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* @brief is object key lookup.
|
|
69
|
+
*/
|
|
70
|
+
export function isObjectKeyLookup(value, keys) {
|
|
71
|
+
if (!isRecord(value)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
const present = Object.keys(value);
|
|
75
|
+
if (present.length !== keys.length) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
79
|
+
const key = keys[index];
|
|
80
|
+
if (key === undefined || value[key] !== true) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
for (let index = 0; index < present.length; index += 1) {
|
|
85
|
+
const key = present[index];
|
|
86
|
+
if (key === undefined || !includesString(keys, key)) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* @brief includes string.
|
|
94
|
+
*/
|
|
95
|
+
export function includesString(values, value) {
|
|
96
|
+
for (let index = 0; index < values.length; index += 1) {
|
|
97
|
+
if (values[index] === value) {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/freeze.ts
|
|
3
|
+
* @brief Schema freezing and collection hardening.
|
|
4
|
+
*/
|
|
5
|
+
import type { Schema } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief freeze schema.
|
|
8
|
+
*/
|
|
9
|
+
export declare function freezeSchema(schema: Schema): Schema;
|
|
10
|
+
//# sourceMappingURL=freeze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"freeze.d.ts","sourceRoot":"","sources":["../../src/schema/freeze.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAGV,MAAM,EAGP,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/freeze.ts
|
|
3
|
+
* @brief Schema freezing and collection hardening.
|
|
4
|
+
*/
|
|
5
|
+
import { SchemaTag, StringCheckTag } from "../kind/index.js";
|
|
6
|
+
import { isPlainRegExp } from "./common.js";
|
|
7
|
+
/**
|
|
8
|
+
* @brief freeze schema.
|
|
9
|
+
*/
|
|
10
|
+
export function freezeSchema(schema) {
|
|
11
|
+
return freezeSchemaInner(schema, new WeakSet());
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* @brief freeze schema inner.
|
|
15
|
+
*/
|
|
16
|
+
function freezeSchemaInner(schema, frozen) {
|
|
17
|
+
if (frozen.has(schema)) {
|
|
18
|
+
return schema;
|
|
19
|
+
}
|
|
20
|
+
frozen.add(schema);
|
|
21
|
+
switch (schema.tag) {
|
|
22
|
+
case SchemaTag.String:
|
|
23
|
+
freezeStringChecks(schema.checks, frozen);
|
|
24
|
+
return Object.freeze(schema);
|
|
25
|
+
case SchemaTag.Number:
|
|
26
|
+
freezeArray(schema.checks, frozen);
|
|
27
|
+
return Object.freeze(schema);
|
|
28
|
+
case SchemaTag.Array:
|
|
29
|
+
freezeSchemaInner(schema.item, frozen);
|
|
30
|
+
return Object.freeze(schema);
|
|
31
|
+
case SchemaTag.Tuple:
|
|
32
|
+
freezeSchemaArray(schema.items, frozen);
|
|
33
|
+
return Object.freeze(schema);
|
|
34
|
+
case SchemaTag.Record:
|
|
35
|
+
freezeSchemaInner(schema.value, frozen);
|
|
36
|
+
return Object.freeze(schema);
|
|
37
|
+
case SchemaTag.Object:
|
|
38
|
+
freezeObjectEntries(schema.entries, frozen);
|
|
39
|
+
Object.freeze(schema.keys);
|
|
40
|
+
Object.freeze(schema.keyLookup);
|
|
41
|
+
return Object.freeze(schema);
|
|
42
|
+
case SchemaTag.Union:
|
|
43
|
+
freezeSchemaArray(schema.options, frozen);
|
|
44
|
+
return Object.freeze(schema);
|
|
45
|
+
case SchemaTag.Intersection:
|
|
46
|
+
freezeSchemaInner(schema.left, frozen);
|
|
47
|
+
freezeSchemaInner(schema.right, frozen);
|
|
48
|
+
return Object.freeze(schema);
|
|
49
|
+
case SchemaTag.Optional:
|
|
50
|
+
case SchemaTag.Undefinedable:
|
|
51
|
+
case SchemaTag.Nullable:
|
|
52
|
+
freezeSchemaInner(schema.inner, frozen);
|
|
53
|
+
return Object.freeze(schema);
|
|
54
|
+
case SchemaTag.DiscriminatedUnion:
|
|
55
|
+
freezeDiscriminatedUnionCases(schema.cases, frozen);
|
|
56
|
+
return Object.freeze(schema);
|
|
57
|
+
case SchemaTag.Brand:
|
|
58
|
+
freezeSchemaInner(schema.inner, frozen);
|
|
59
|
+
return Object.freeze(schema);
|
|
60
|
+
case SchemaTag.Refine:
|
|
61
|
+
freezeSchemaInner(schema.inner, frozen);
|
|
62
|
+
return Object.freeze(schema);
|
|
63
|
+
case SchemaTag.Unknown:
|
|
64
|
+
case SchemaTag.Never:
|
|
65
|
+
case SchemaTag.BigInt:
|
|
66
|
+
case SchemaTag.Symbol:
|
|
67
|
+
case SchemaTag.Boolean:
|
|
68
|
+
case SchemaTag.Literal:
|
|
69
|
+
case SchemaTag.Lazy:
|
|
70
|
+
return Object.freeze(schema);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* @brief freeze array.
|
|
75
|
+
*/
|
|
76
|
+
function freezeArray(values, frozen) {
|
|
77
|
+
for (let index = 0; index < values.length; index += 1) {
|
|
78
|
+
const value = values[index];
|
|
79
|
+
if (value !== undefined && !frozen.has(value)) {
|
|
80
|
+
frozen.add(value);
|
|
81
|
+
Object.freeze(value);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
Object.freeze(values);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* @brief freeze string checks.
|
|
88
|
+
*/
|
|
89
|
+
function freezeStringChecks(values, frozen) {
|
|
90
|
+
for (let index = 0; index < values.length; index += 1) {
|
|
91
|
+
const value = values[index];
|
|
92
|
+
if (value === undefined || frozen.has(value)) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (value.tag === StringCheckTag.Regex) {
|
|
96
|
+
freezeRegexCheck(value);
|
|
97
|
+
}
|
|
98
|
+
frozen.add(value);
|
|
99
|
+
Object.freeze(value);
|
|
100
|
+
}
|
|
101
|
+
Object.freeze(values);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* @brief freeze regex check.
|
|
105
|
+
*/
|
|
106
|
+
function freezeRegexCheck(check) {
|
|
107
|
+
const regex = check.regex;
|
|
108
|
+
if (!isPlainRegExp(regex)) {
|
|
109
|
+
throw new TypeError("regex check must use a plain RegExp");
|
|
110
|
+
}
|
|
111
|
+
if (Object.isFrozen(check)) {
|
|
112
|
+
if (Object.isExtensible(regex)) {
|
|
113
|
+
throw new TypeError("frozen regex check must contain a non-extensible RegExp");
|
|
114
|
+
}
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const cloned = new RegExp(regex.source, regex.flags);
|
|
118
|
+
Object.preventExtensions(cloned);
|
|
119
|
+
Object.defineProperty(check, "regex", {
|
|
120
|
+
configurable: false,
|
|
121
|
+
enumerable: true,
|
|
122
|
+
value: cloned,
|
|
123
|
+
writable: false
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* @brief freeze schema array.
|
|
128
|
+
*/
|
|
129
|
+
function freezeSchemaArray(values, frozen) {
|
|
130
|
+
for (let index = 0; index < values.length; index += 1) {
|
|
131
|
+
const value = values[index];
|
|
132
|
+
if (value !== undefined) {
|
|
133
|
+
freezeSchemaInner(value, frozen);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
Object.freeze(values);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* @brief freeze object entries.
|
|
140
|
+
*/
|
|
141
|
+
function freezeObjectEntries(entries, frozen) {
|
|
142
|
+
for (let index = 0; index < entries.length; index += 1) {
|
|
143
|
+
const entry = entries[index];
|
|
144
|
+
if (entry !== undefined) {
|
|
145
|
+
freezeSchemaInner(entry.schema, frozen);
|
|
146
|
+
Object.freeze(entry);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
Object.freeze(entries);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* @brief freeze discriminated union cases.
|
|
153
|
+
*/
|
|
154
|
+
function freezeDiscriminatedUnionCases(cases, frozen) {
|
|
155
|
+
for (let index = 0; index < cases.length; index += 1) {
|
|
156
|
+
const unionCase = cases[index];
|
|
157
|
+
if (unionCase !== undefined) {
|
|
158
|
+
freezeSchemaInner(unionCase.schema, frozen);
|
|
159
|
+
Object.freeze(unionCase);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
Object.freeze(cases);
|
|
163
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file schema/index.ts
|
|
3
|
+
* @brief Schema module aggregate.
|
|
4
|
+
*/
|
|
5
|
+
export type { ArraySchema, BigIntSchema, BooleanSchema, BrandSchema, DiscriminatedUnionCase, DiscriminatedUnionSchema, IntersectionSchema, LazySchema, LiteralSchema, LiteralValue, NeverSchema, NullableSchema, NumberCheck, NumberGteCheck, NumberIntegerCheck, NumberLteCheck, NumberSchema, ObjectEntry, ObjectKeyLookup, ObjectSchema, OptionalSchema, RecordSchema, RefineSchema, Schema, StringCheck, StringMaxCheck, StringMinCheck, StringRegexCheck, StringSchema, StringUuidCheck, SymbolSchema, TupleSchema, UndefinedableSchema, UnionSchema, UnknownSchema } from "./types.js";
|
|
6
|
+
export { UUID_PATTERN } from "./types.js";
|
|
7
|
+
export { isLiteralValue } from "./literal.js";
|
|
8
|
+
export { isSchemaValue } from "./validate.js";
|
|
9
|
+
export { freezeSchema } from "./freeze.js";
|
|
10
|
+
export { resolveLazySchema } from "./lazy.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,eAAe,EACf,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,WAAW,EACX,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
|