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,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file compile/check-composite.ts
|
|
3
|
+
* @brief Composite diagnostic validator snippets.
|
|
4
|
+
*/
|
|
5
|
+
import { ObjectModeTag, PresenceTag, SchemaTag } from "../kind/index.js";
|
|
6
|
+
import { pushKeyset, pushLiteral, stringRef } from "./context.js";
|
|
7
|
+
import { emitIssue, emitIssueExpr } from "./issue.js";
|
|
8
|
+
import { stringLiteral } from "./names.js";
|
|
9
|
+
/**
|
|
10
|
+
* @brief emit array check.
|
|
11
|
+
*/
|
|
12
|
+
export function emitArrayCheck(item, value, path, issues, context, emitChild) {
|
|
13
|
+
const itemFunction = emitChild(item, context);
|
|
14
|
+
return [
|
|
15
|
+
`if(!Array.isArray(${value})){${emitIssue(issues, path, "expected_array", "array", `a(${value})`)}return;}`,
|
|
16
|
+
`for(let i=0;i<${value}.length;i+=1){`,
|
|
17
|
+
`const d=gp(${value},i);`,
|
|
18
|
+
`${path}.push(i);`,
|
|
19
|
+
`if(d!==undefined&&!h.call(d,"value")){${emitIssue(issues, path, "expected_array", "data property", stringLiteral("accessor"))}}else{${itemFunction}(d===undefined?undefined:d.value,${path},${issues});}`,
|
|
20
|
+
`${path}.pop();`,
|
|
21
|
+
"}"
|
|
22
|
+
].join("");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* @brief emit tuple check.
|
|
26
|
+
*/
|
|
27
|
+
export function emitTupleCheck(items, value, path, issues, context, emitChild) {
|
|
28
|
+
const parts = [
|
|
29
|
+
`if(!Array.isArray(${value})){${emitIssue(issues, path, "expected_tuple", "tuple", `a(${value})`)}return;}`,
|
|
30
|
+
`if(${value}.length!==${String(items.length)}){${emitIssue(issues, path, "expected_tuple_length", `length ${String(items.length)}`, `"length "+String(${value}.length)`)}}`,
|
|
31
|
+
`const n=${value}.length<${String(items.length)}?${value}.length:${String(items.length)};`
|
|
32
|
+
];
|
|
33
|
+
for (let index = 0; index < items.length; index += 1) {
|
|
34
|
+
const item = items[index];
|
|
35
|
+
if (item === undefined) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const itemFunction = emitChild(item, context);
|
|
39
|
+
parts.push(`if(${String(index)}<n){const d=gp(${value},${String(index)});${path}.push(${String(index)});if(d!==undefined&&!h.call(d,"value")){${emitIssue(issues, path, "expected_tuple", "data property", stringLiteral("accessor"))}}else{${itemFunction}(d===undefined?undefined:d.value,${path},${issues});}${path}.pop();}`);
|
|
40
|
+
}
|
|
41
|
+
return parts.join("");
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* @brief emit record check.
|
|
45
|
+
*/
|
|
46
|
+
export function emitRecordCheck(item, value, path, issues, context, emitChild) {
|
|
47
|
+
const itemFunction = emitChild(item, context);
|
|
48
|
+
return [
|
|
49
|
+
`if(!o(${value})){${emitIssue(issues, path, "expected_record", "record", `a(${value})`)}return;}`,
|
|
50
|
+
`const ks=Object.keys(${value});`,
|
|
51
|
+
"for(let i=0;i<ks.length;i+=1){",
|
|
52
|
+
"const key=ks[i];",
|
|
53
|
+
`if(key!==undefined){const d=g(${value},key);${path}.push(key);if(d===undefined){${emitIssue(issues, path, "expected_record", "data property", stringLiteral("accessor or missing"))}}else{${itemFunction}(d.value,${path},${issues});}${path}.pop();}`,
|
|
54
|
+
"}"
|
|
55
|
+
].join("");
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* @brief emit object check.
|
|
59
|
+
*/
|
|
60
|
+
export function emitObjectCheck(schema, value, path, issues, context, emitChild) {
|
|
61
|
+
const parts = [
|
|
62
|
+
`if(!o(${value})){${emitIssue(issues, path, "expected_object", "object", `a(${value})`)}return;}`
|
|
63
|
+
];
|
|
64
|
+
const entries = schema.entries;
|
|
65
|
+
for (let index = 0; index < entries.length; index += 1) {
|
|
66
|
+
const entry = entries[index];
|
|
67
|
+
if (entry === undefined) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const key = stringRef(context, entry.key);
|
|
71
|
+
const child = emitChild(entry.schema, context);
|
|
72
|
+
if (entry.presence === PresenceTag.Required) {
|
|
73
|
+
parts.push(`{const d=g(${value},${key});if(d===undefined){${path}.push(${key});${emitIssue(issues, path, "expected_required_key", "present key", stringLiteral("missing"))}${path}.pop();}else{${path}.push(${key});${child}(d.value,${path},${issues});${path}.pop();}}`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
parts.push(`if(h.call(${value},${key})){const d=g(${value},${key});${path}.push(${key});if(d===undefined){${emitIssue(issues, path, "expected_object", "data property", stringLiteral("accessor"))}}else{${child}(d.value,${path},${issues});}${path}.pop();}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (schema.mode === ObjectModeTag.Strict) {
|
|
80
|
+
const keys = new Array(schema.entries.length);
|
|
81
|
+
for (let index = 0; index < schema.entries.length; index += 1) {
|
|
82
|
+
const entry = schema.entries[index];
|
|
83
|
+
if (entry !== undefined) {
|
|
84
|
+
keys[index] = entry.key;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
parts.push(`const xs=Reflect.ownKeys(${value});for(let i=0;i<xs.length;i+=1){const key=xs[i];if(key!==undefined&&(typeof key!=="string"||!k[${String(pushKeyset(context, keys))}].includes(key))){${path}.push(typeof key==="string"?key:String(key));${emitIssue(issues, path, "unrecognized_key", "known key", stringLiteral("extra key"))}${path}.pop();}}`);
|
|
88
|
+
}
|
|
89
|
+
return parts.join("");
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* @brief emit discriminated union check.
|
|
93
|
+
*/
|
|
94
|
+
export function emitDiscriminatedUnionCheck(key, cases, value, path, issues, context, emitChild) {
|
|
95
|
+
const keyRef = stringRef(context, key);
|
|
96
|
+
const descriptor = `g(${value},${keyRef})`;
|
|
97
|
+
const parts = [
|
|
98
|
+
`if(!o(${value})){${emitIssue(issues, path, "expected_object", "object", `a(${value})`)}return;}`,
|
|
99
|
+
`const dd=${descriptor};`,
|
|
100
|
+
`if(dd===undefined){${path}.push(${keyRef});${emitIssue(issues, path, "expected_discriminant", "data property", stringLiteral("missing or accessor"))}${path}.pop();return;}`,
|
|
101
|
+
"const dv=dd.value;",
|
|
102
|
+
`if(typeof dv!=="string"){${path}.push(${keyRef});${emitIssue(issues, path, "expected_discriminant", "string discriminant", "a(dv)")}${path}.pop();return;}`
|
|
103
|
+
];
|
|
104
|
+
for (let index = 0; index < cases.length; index += 1) {
|
|
105
|
+
const unionCase = cases[index];
|
|
106
|
+
if (unionCase === undefined) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const literal = unionCase.literal;
|
|
110
|
+
const schema = unionCase.schema;
|
|
111
|
+
const literalIndex = pushLiteral(context, literal);
|
|
112
|
+
const check = emitChild(schema, context);
|
|
113
|
+
parts.push(`if(Object.is(dv,l[${String(literalIndex)}])){${check}(${value},${path},${issues});return;}`);
|
|
114
|
+
}
|
|
115
|
+
parts.push(`${path}.push(${keyRef});${emitIssueExpr(issues, path, "expected_discriminant", stringLiteral("known discriminant"), "le(dv)")}${path}.pop();`);
|
|
116
|
+
return parts.join("");
|
|
117
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file compile/check-scalar.ts
|
|
3
|
+
* @brief Scalar diagnostic validator snippets.
|
|
4
|
+
*/
|
|
5
|
+
import { SchemaTag } from "../kind/index.js";
|
|
6
|
+
import { type LiteralValue, type Schema } from "../schema/index.js";
|
|
7
|
+
import type { EmitContext } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* @brief emit string check.
|
|
10
|
+
*/
|
|
11
|
+
export declare function emitStringCheck(schema: Extract<Schema, {
|
|
12
|
+
readonly tag: typeof SchemaTag.String;
|
|
13
|
+
}>, value: string, path: string, issues: string, context: EmitContext): string;
|
|
14
|
+
/**
|
|
15
|
+
* @brief emit number check.
|
|
16
|
+
*/
|
|
17
|
+
export declare function emitNumberCheck(schema: Extract<Schema, {
|
|
18
|
+
readonly tag: typeof SchemaTag.Number;
|
|
19
|
+
}>, value: string, path: string, issues: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* @brief emit literal check.
|
|
22
|
+
*/
|
|
23
|
+
export declare function emitLiteralCheck(value: LiteralValue, checked: string, path: string, issues: string, context: EmitContext): string;
|
|
24
|
+
//# sourceMappingURL=check-scalar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-scalar.d.ts","sourceRoot":"","sources":["../../src/compile/check-scalar.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAEL,SAAS,EAEV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,MAAM,EACZ,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,SAAS,CAAC,MAAM,CAAA;CAAE,CAAC,EAClE,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,GACnB,MAAM,CA4CR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,SAAS,CAAC,MAAM,CAAA;CAAE,CAAC,EAClE,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,MAAM,CA+CR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,GACnB,MAAM,CASR"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file compile/check-scalar.ts
|
|
3
|
+
* @brief Scalar diagnostic validator snippets.
|
|
4
|
+
*/
|
|
5
|
+
import { NumberCheckTag, SchemaTag, StringCheckTag } from "../kind/index.js";
|
|
6
|
+
import { UUID_PATTERN } from "../schema/index.js";
|
|
7
|
+
import { pushLiteral } from "./context.js";
|
|
8
|
+
import { emitIssue, emitIssueExpr, emitPatternIssue } from "./issue.js";
|
|
9
|
+
import { stringLiteral } from "./names.js";
|
|
10
|
+
/**
|
|
11
|
+
* @brief emit string check.
|
|
12
|
+
*/
|
|
13
|
+
export function emitStringCheck(schema, value, path, issues, context) {
|
|
14
|
+
const parts = [
|
|
15
|
+
`if(typeof ${value}!=="string"){${emitIssue(issues, path, "expected_string", "string", `a(${value})`)}return;}`
|
|
16
|
+
];
|
|
17
|
+
const checks = schema.checks;
|
|
18
|
+
for (let index = 0; index < checks.length; index += 1) {
|
|
19
|
+
const check = checks[index];
|
|
20
|
+
if (check === undefined) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
switch (check.tag) {
|
|
24
|
+
case StringCheckTag.Min:
|
|
25
|
+
parts.push(`if(${value}.length<${String(check.value)}){${emitIssue(issues, path, "expected_min_length", `length >= ${String(check.value)}`, `"length "+String(${value}.length)`)}}`);
|
|
26
|
+
break;
|
|
27
|
+
case StringCheckTag.Max:
|
|
28
|
+
parts.push(`if(${value}.length>${String(check.value)}){${emitIssue(issues, path, "expected_max_length", `length <= ${String(check.value)}`, `"length "+String(${value}.length)`)}}`);
|
|
29
|
+
break;
|
|
30
|
+
case StringCheckTag.Regex:
|
|
31
|
+
parts.push(emitPatternIssue(value, path, issues, check.regex, check.name, context));
|
|
32
|
+
break;
|
|
33
|
+
case StringCheckTag.Uuid:
|
|
34
|
+
parts.push(emitPatternIssue(value, path, issues, UUID_PATTERN, "uuid", context));
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return parts.join("");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @brief emit number check.
|
|
42
|
+
*/
|
|
43
|
+
export function emitNumberCheck(schema, value, path, issues) {
|
|
44
|
+
const parts = [
|
|
45
|
+
`if(typeof ${value}!=="number"||!Number.isFinite(${value})){${emitIssue(issues, path, "expected_number", "number", `a(${value})`)}return;}`
|
|
46
|
+
];
|
|
47
|
+
const checks = schema.checks;
|
|
48
|
+
for (let index = 0; index < checks.length; index += 1) {
|
|
49
|
+
const check = checks[index];
|
|
50
|
+
if (check === undefined) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
switch (check.tag) {
|
|
54
|
+
case NumberCheckTag.Integer:
|
|
55
|
+
parts.push(`if(!Number.isInteger(${value})){${emitIssueExpr(issues, path, "expected_integer", stringLiteral("integer"), stringLiteral("number"))}}`);
|
|
56
|
+
break;
|
|
57
|
+
case NumberCheckTag.Gte:
|
|
58
|
+
parts.push(`if(${value}<${String(check.value)}){${emitIssue(issues, path, "expected_gte", `>= ${String(check.value)}`, `String(${value})`)}}`);
|
|
59
|
+
break;
|
|
60
|
+
case NumberCheckTag.Lte:
|
|
61
|
+
parts.push(`if(${value}>${String(check.value)}){${emitIssue(issues, path, "expected_lte", `<= ${String(check.value)}`, `String(${value})`)}}`);
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return parts.join("");
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* @brief emit literal check.
|
|
69
|
+
*/
|
|
70
|
+
export function emitLiteralCheck(value, checked, path, issues, context) {
|
|
71
|
+
const index = pushLiteral(context, value);
|
|
72
|
+
return `if(!Object.is(${checked},l[${String(index)}])){${emitIssueExpr(issues, path, "expected_literal", `le(l[${String(index)}])`, `a(${checked})`)}}`;
|
|
73
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file compile/check.ts
|
|
3
|
+
* @brief Diagnostic validator function table emitter.
|
|
4
|
+
*/
|
|
5
|
+
import type { Schema } from "../schema/index.js";
|
|
6
|
+
import type { EmitContext } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* @brief emit check function.
|
|
9
|
+
*/
|
|
10
|
+
export declare function emitCheckFunction(schema: Schema, context: EmitContext): string;
|
|
11
|
+
/**
|
|
12
|
+
* @brief emit check functions.
|
|
13
|
+
*/
|
|
14
|
+
export declare function emitCheckFunctions(context: EmitContext): string;
|
|
15
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/compile/check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAgBjD,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,YAAY,CAAC;AAE9D;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CAc9E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAU/D"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file compile/check.ts
|
|
3
|
+
* @brief Diagnostic validator function table emitter.
|
|
4
|
+
*/
|
|
5
|
+
import { SchemaTag } from "../kind/index.js";
|
|
6
|
+
import { emitArrayCheck, emitDiscriminatedUnionCheck, emitObjectCheck, emitRecordCheck, emitTupleCheck } from "./check-composite.js";
|
|
7
|
+
import { emitLiteralCheck, emitNumberCheck, emitStringCheck } from "./check-scalar.js";
|
|
8
|
+
import { pushSchema } from "./context.js";
|
|
9
|
+
import { emitIssue } from "./issue.js";
|
|
10
|
+
import { emitUnion } from "./predicate.js";
|
|
11
|
+
/**
|
|
12
|
+
* @brief emit check function.
|
|
13
|
+
*/
|
|
14
|
+
export function emitCheckFunction(schema, context) {
|
|
15
|
+
const cached = context.checkFunctionNames.get(schema);
|
|
16
|
+
if (cached !== undefined) {
|
|
17
|
+
return cached;
|
|
18
|
+
}
|
|
19
|
+
const name = `c${String(context.checkFunctions.length)}`;
|
|
20
|
+
const source = {
|
|
21
|
+
name,
|
|
22
|
+
body: ""
|
|
23
|
+
};
|
|
24
|
+
context.checkFunctionNames.set(schema, name);
|
|
25
|
+
context.checkFunctions.push(source);
|
|
26
|
+
source.body = emitCheckBody(schema, "v", "p", "s", context);
|
|
27
|
+
return name;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* @brief emit check functions.
|
|
31
|
+
*/
|
|
32
|
+
export function emitCheckFunctions(context) {
|
|
33
|
+
const chunks = new Array(context.checkFunctions.length);
|
|
34
|
+
for (let index = 0; index < context.checkFunctions.length; index += 1) {
|
|
35
|
+
const source = context.checkFunctions[index];
|
|
36
|
+
if (source === undefined) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
chunks[index] = `function ${source.name}(v,p,s){${source.body}}`;
|
|
40
|
+
}
|
|
41
|
+
return chunks.join("");
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* @brief emit check body.
|
|
45
|
+
*/
|
|
46
|
+
function emitCheckBody(schema, value, path, issues, context) {
|
|
47
|
+
switch (schema.tag) {
|
|
48
|
+
case SchemaTag.Unknown:
|
|
49
|
+
return "return;";
|
|
50
|
+
case SchemaTag.Never:
|
|
51
|
+
return emitIssue(issues, path, "expected_never", "never", `a(${value})`);
|
|
52
|
+
case SchemaTag.String:
|
|
53
|
+
return emitStringCheck(schema, value, path, issues, context);
|
|
54
|
+
case SchemaTag.Number:
|
|
55
|
+
return emitNumberCheck(schema, value, path, issues);
|
|
56
|
+
case SchemaTag.BigInt:
|
|
57
|
+
return `if(typeof ${value}!=="bigint"){${emitIssue(issues, path, "expected_bigint", "bigint", `a(${value})`)}}`;
|
|
58
|
+
case SchemaTag.Symbol:
|
|
59
|
+
return `if(typeof ${value}!=="symbol"){${emitIssue(issues, path, "expected_symbol", "symbol", `a(${value})`)}}`;
|
|
60
|
+
case SchemaTag.Boolean:
|
|
61
|
+
return `if(typeof ${value}!=="boolean"){${emitIssue(issues, path, "expected_boolean", "boolean", `a(${value})`)}}`;
|
|
62
|
+
case SchemaTag.Literal:
|
|
63
|
+
return emitLiteralCheck(schema.value, value, path, issues, context);
|
|
64
|
+
case SchemaTag.Array:
|
|
65
|
+
return emitArrayCheck(schema.item, value, path, issues, context, emitCheckFunction);
|
|
66
|
+
case SchemaTag.Tuple:
|
|
67
|
+
return emitTupleCheck(schema.items, value, path, issues, context, emitCheckFunction);
|
|
68
|
+
case SchemaTag.Record:
|
|
69
|
+
return emitRecordCheck(schema.value, value, path, issues, context, emitCheckFunction);
|
|
70
|
+
case SchemaTag.Object:
|
|
71
|
+
return emitObjectCheck(schema, value, path, issues, context, emitCheckFunction);
|
|
72
|
+
case SchemaTag.Union:
|
|
73
|
+
return `if(!${emitUnion(schema.options, value, context)}){${emitIssue(issues, path, "expected_union", "union", `a(${value})`)}}`;
|
|
74
|
+
case SchemaTag.Intersection:
|
|
75
|
+
return [
|
|
76
|
+
emitCheckCall(schema.left, value, path, issues, context),
|
|
77
|
+
emitCheckCall(schema.right, value, path, issues, context)
|
|
78
|
+
].join("");
|
|
79
|
+
case SchemaTag.Optional:
|
|
80
|
+
case SchemaTag.Undefinedable:
|
|
81
|
+
return `if(${value}!==undefined){${emitCheckCall(schema.inner, value, path, issues, context)}}`;
|
|
82
|
+
case SchemaTag.Nullable:
|
|
83
|
+
return `if(${value}!==null){${emitCheckCall(schema.inner, value, path, issues, context)}}`;
|
|
84
|
+
case SchemaTag.DiscriminatedUnion:
|
|
85
|
+
return emitDiscriminatedUnionCheck(schema.key, schema.cases, value, path, issues, context, emitCheckFunction);
|
|
86
|
+
case SchemaTag.Brand:
|
|
87
|
+
return emitCheckCall(schema.inner, value, path, issues, context);
|
|
88
|
+
case SchemaTag.Lazy:
|
|
89
|
+
case SchemaTag.Refine:
|
|
90
|
+
return `m(${String(pushSchema(context, schema))},${value},${path},${issues});`;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* @brief emit check call.
|
|
95
|
+
*/
|
|
96
|
+
function emitCheckCall(schema, value, path, issues, context) {
|
|
97
|
+
return `${emitCheckFunction(schema, context)}(${value},${path},${issues});`;
|
|
98
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file compile/context.ts
|
|
3
|
+
* @brief Generated-source emitter side-table context.
|
|
4
|
+
*/
|
|
5
|
+
import type { LiteralValue, Schema } from "../schema/index.js";
|
|
6
|
+
import type { EmitContext } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* @brief create emit context.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createEmitContext(): EmitContext;
|
|
11
|
+
/**
|
|
12
|
+
* @brief push literal.
|
|
13
|
+
*/
|
|
14
|
+
export declare function pushLiteral(context: EmitContext, value: LiteralValue): number;
|
|
15
|
+
/**
|
|
16
|
+
* @brief push regex.
|
|
17
|
+
*/
|
|
18
|
+
export declare function pushRegex(context: EmitContext, value: RegExp): number;
|
|
19
|
+
/**
|
|
20
|
+
* @brief push keyset.
|
|
21
|
+
*/
|
|
22
|
+
export declare function pushKeyset(context: EmitContext, value: readonly string[]): number;
|
|
23
|
+
/**
|
|
24
|
+
* @brief string ref.
|
|
25
|
+
*/
|
|
26
|
+
export declare function stringRef(context: EmitContext, value: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* @brief push string.
|
|
29
|
+
*/
|
|
30
|
+
export declare function pushString(context: EmitContext, value: string): number;
|
|
31
|
+
/**
|
|
32
|
+
* @brief push schema.
|
|
33
|
+
*/
|
|
34
|
+
export declare function pushSchema(context: EmitContext, value: Schema): number;
|
|
35
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/compile/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAa/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAI7E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIrE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAIjF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAErE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAStE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAItE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file compile/context.ts
|
|
3
|
+
* @brief Generated-source emitter side-table context.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @brief create emit context.
|
|
7
|
+
*/
|
|
8
|
+
export function createEmitContext() {
|
|
9
|
+
return {
|
|
10
|
+
literals: [],
|
|
11
|
+
regexps: [],
|
|
12
|
+
keysets: [],
|
|
13
|
+
strings: [],
|
|
14
|
+
schemas: [],
|
|
15
|
+
functions: [],
|
|
16
|
+
functionNames: new Map(),
|
|
17
|
+
checkFunctions: [],
|
|
18
|
+
checkFunctionNames: new Map(),
|
|
19
|
+
stringIndexes: new Map()
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* @brief push literal.
|
|
24
|
+
*/
|
|
25
|
+
export function pushLiteral(context, value) {
|
|
26
|
+
const index = context.literals.length;
|
|
27
|
+
context.literals.push(value);
|
|
28
|
+
return index;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* @brief push regex.
|
|
32
|
+
*/
|
|
33
|
+
export function pushRegex(context, value) {
|
|
34
|
+
const index = context.regexps.length;
|
|
35
|
+
context.regexps.push(new RegExp(value.source, value.flags));
|
|
36
|
+
return index;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* @brief push keyset.
|
|
40
|
+
*/
|
|
41
|
+
export function pushKeyset(context, value) {
|
|
42
|
+
const index = context.keysets.length;
|
|
43
|
+
context.keysets.push(value);
|
|
44
|
+
return index;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* @brief string ref.
|
|
48
|
+
*/
|
|
49
|
+
export function stringRef(context, value) {
|
|
50
|
+
return `u[${String(pushString(context, value))}]`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* @brief push string.
|
|
54
|
+
*/
|
|
55
|
+
export function pushString(context, value) {
|
|
56
|
+
const cached = context.stringIndexes.get(value);
|
|
57
|
+
if (cached !== undefined) {
|
|
58
|
+
return cached;
|
|
59
|
+
}
|
|
60
|
+
const index = context.strings.length;
|
|
61
|
+
context.strings.push(value);
|
|
62
|
+
context.stringIndexes.set(value, index);
|
|
63
|
+
return index;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @brief push schema.
|
|
67
|
+
*/
|
|
68
|
+
export function pushSchema(context, value) {
|
|
69
|
+
const index = context.schemas.length;
|
|
70
|
+
context.schemas.push(value);
|
|
71
|
+
return index;
|
|
72
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file graph-predicate.ts
|
|
3
|
+
* @brief Predicate source emitter backed by optimized Sea-of-Nodes graphs.
|
|
4
|
+
*/
|
|
5
|
+
import type { Schema } from "../schema/index.js";
|
|
6
|
+
import type { EmitContext } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* @brief emit graph function.
|
|
9
|
+
* @details Emits one predicate function from the optimized graph owned by a schema plan.
|
|
10
|
+
* @returns Generated function name.
|
|
11
|
+
*/
|
|
12
|
+
export declare function emitGraphFunction(schema: Schema, context: EmitContext): string;
|
|
13
|
+
/**
|
|
14
|
+
* @brief emit graph functions.
|
|
15
|
+
* @details Serializes every graph predicate function accumulated in the context.
|
|
16
|
+
* @returns JavaScript source for the predicate function table.
|
|
17
|
+
*/
|
|
18
|
+
export declare function emitGraphFunctions(context: EmitContext): string;
|
|
19
|
+
//# sourceMappingURL=graph-predicate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-predicate.d.ts","sourceRoot":"","sources":["../../src/compile/graph-predicate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAgB,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQ/D,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,YAAY,CAAC;AAoB9D;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,GACnB,MAAM,CAoBR;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAS/D"}
|