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,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file compile/source.ts
|
|
3
|
+
* @brief Generated validator source bundle assembly.
|
|
4
|
+
*/
|
|
5
|
+
import { emitCheckFunction, emitCheckFunctions } from "./check.js";
|
|
6
|
+
import { createEmitContext } from "./context.js";
|
|
7
|
+
import { emitGraphFunction, emitGraphFunctions } from "./graph-predicate.js";
|
|
8
|
+
import { safeFunctionName } from "./names.js";
|
|
9
|
+
/**
|
|
10
|
+
* @brief emit compiled source bundle.
|
|
11
|
+
*/
|
|
12
|
+
export function emitCompiledSourceBundle(schema, name) {
|
|
13
|
+
const context = createEmitContext();
|
|
14
|
+
const root = emitGraphFunction(schema, context);
|
|
15
|
+
const checkRoot = emitCheckFunction(schema, context);
|
|
16
|
+
const functionName = safeFunctionName(name);
|
|
17
|
+
const checkFunctionName = `${functionName}_check`;
|
|
18
|
+
const source = [
|
|
19
|
+
"\"use strict\";",
|
|
20
|
+
"const h=Object.prototype.hasOwnProperty;",
|
|
21
|
+
"const gp=Object.getOwnPropertyDescriptor;",
|
|
22
|
+
"const o=function(v){return typeof v===\"object\"&&v!==null&&!Array.isArray(v);};",
|
|
23
|
+
"const ph=function(v){return (typeof v===\"object\"&&v!==null)||typeof v===\"function\";};",
|
|
24
|
+
"const g=function(v,k){const d=gp(v,k);return d!==undefined&&h.call(d,\"value\")?d:undefined;};",
|
|
25
|
+
"const gv=function(v,k){if(!ph(v))return undefined;const d=gp(v,k);return d!==undefined&&h.call(d,\"value\")?d.value:undefined;};",
|
|
26
|
+
"const ho=function(v,k){return ph(v)&&h.call(v,k);};",
|
|
27
|
+
"const hd=function(v,k){if(!ph(v))return false;const d=gp(v,k);return d!==undefined&&h.call(d,\"value\");};",
|
|
28
|
+
"const fn=function(v){return typeof v===\"number\"&&Number.isFinite(v);};",
|
|
29
|
+
"const nc=function(x,y,gte){return typeof x===\"number\"&&typeof y===\"number\"&&(gte?x>=y:x<=y);};",
|
|
30
|
+
"const sb=function(v,b,min){return typeof v===\"string\"&&(min?v.length>=b:v.length<=b);};",
|
|
31
|
+
"const rx=function(v,re){if(typeof v!==\"string\")return false;re.lastIndex=0;const ok=re.test(v);re.lastIndex=0;return ok;};",
|
|
32
|
+
"const ea=function(v,f){if(!Array.isArray(v))return false;for(let i=0;i<v.length;i+=1){const d=gp(v,i);if(d!==undefined&&!h.call(d,\"value\"))return false;if(!f(d===undefined?undefined:d.value))return false;}return true;};",
|
|
33
|
+
"const ev=function(v,i,f){const d=gp(v,i);if(d!==undefined&&!h.call(d,\"value\"))return false;return f(d===undefined?undefined:d.value);};",
|
|
34
|
+
"const er=function(v,f){if(!o(v))return false;const ks=Object.keys(v);for(let i=0;i<ks.length;i+=1){const key=ks[i];if(key===undefined)return false;const d=gp(v,key);if(d===undefined||!h.call(d,\"value\")||!f(d.value))return false;}return true;};",
|
|
35
|
+
"const dj=function(v,key,ks){if(!o(v))return false;const d=g(v,key);if(d===undefined||typeof d.value!==\"string\")return false;const i=ks.indexOf(d.value);return i>=0&&arguments[i+3](v);};",
|
|
36
|
+
"const a=function(v){if(v===null)return \"null\";if(Array.isArray(v))return \"array\";if(typeof v===\"bigint\")return \"bigint\";if(typeof v===\"symbol\")return \"symbol\";if(typeof v===\"number\"&&Number.isNaN(v))return \"nan\";return typeof v;};",
|
|
37
|
+
"const le=function(v){if(v===null)return \"null\";if(v===undefined)return \"undefined\";if(typeof v===\"string\")return JSON.stringify(v);if(typeof v===\"number\"&&Object.is(v,-0))return \"-0\";if(typeof v===\"symbol\")return String(v);return String(v);};",
|
|
38
|
+
"const q=function(s,p,c,e,x){s.push({path:p.slice(),code:c,expected:e,actual:x,message:undefined});};",
|
|
39
|
+
emitGraphFunctions(context),
|
|
40
|
+
emitCheckFunctions(context),
|
|
41
|
+
`return {is:function ${functionName}(x){return ${root}(x);},check:function ${checkFunctionName}(x){const s=[];if(${root}(x))return s;${checkRoot}(x,[],s);return s;}};`
|
|
42
|
+
].join("");
|
|
43
|
+
return {
|
|
44
|
+
source,
|
|
45
|
+
literals: context.literals,
|
|
46
|
+
regexps: context.regexps,
|
|
47
|
+
keysets: context.keysets,
|
|
48
|
+
strings: context.strings,
|
|
49
|
+
dynamicSchemas: context.schemas
|
|
50
|
+
};
|
|
51
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file compile/types.ts
|
|
3
|
+
* @brief Shared compile-time data contracts.
|
|
4
|
+
*/
|
|
5
|
+
import type { Guard, Presence } from "../guard/index.js";
|
|
6
|
+
import type { LiteralValue, Schema } from "../schema/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* @brief emit context.
|
|
9
|
+
*/
|
|
10
|
+
export interface EmitContext {
|
|
11
|
+
readonly literals: LiteralValue[];
|
|
12
|
+
readonly regexps: RegExp[];
|
|
13
|
+
readonly keysets: (readonly string[])[];
|
|
14
|
+
readonly strings: string[];
|
|
15
|
+
readonly schemas: Schema[];
|
|
16
|
+
readonly functions: FunctionSource[];
|
|
17
|
+
readonly functionNames: Map<Schema, string>;
|
|
18
|
+
readonly checkFunctions: FunctionSource[];
|
|
19
|
+
readonly checkFunctionNames: Map<Schema, string>;
|
|
20
|
+
readonly stringIndexes: Map<string, number>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* @brief function source.
|
|
24
|
+
*/
|
|
25
|
+
export interface FunctionSource {
|
|
26
|
+
readonly name: string;
|
|
27
|
+
body: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* @brief compiled source bundle.
|
|
31
|
+
*/
|
|
32
|
+
export interface CompiledSourceBundle {
|
|
33
|
+
readonly source: string;
|
|
34
|
+
readonly literals: readonly LiteralValue[];
|
|
35
|
+
readonly regexps: readonly RegExp[];
|
|
36
|
+
readonly keysets: readonly (readonly string[])[];
|
|
37
|
+
readonly strings: readonly string[];
|
|
38
|
+
readonly dynamicSchemas: readonly Schema[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* @brief compiled guard.
|
|
42
|
+
*/
|
|
43
|
+
export interface CompiledGuard<TValue, TPresence extends Presence = "required"> extends Guard<TValue, TPresence> {
|
|
44
|
+
readonly source: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* @brief compile options.
|
|
48
|
+
*/
|
|
49
|
+
export interface CompileOptions {
|
|
50
|
+
readonly name: string | undefined;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/compile/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,cAAc,EAAE,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC;IAC1C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAC5B,MAAM,EACN,SAAS,SAAS,QAAQ,GAAG,UAAU,CACvC,SAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { Guard, Presence, RuntimeValue } from "../guard/index.js";
|
|
2
|
+
import type { CheckResult } from "../issue/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* @brief decode runner.
|
|
5
|
+
*/
|
|
6
|
+
type DecodeRunner<TValue> = (value: unknown) => CheckResult<TValue>;
|
|
7
|
+
/**
|
|
8
|
+
* @brief decoder run symbol.
|
|
9
|
+
*/
|
|
10
|
+
declare const DecoderRunSymbol: unique symbol;
|
|
11
|
+
/**
|
|
12
|
+
* @brief decode source.
|
|
13
|
+
*/
|
|
14
|
+
export type DecodeSource = Guard<unknown, Presence> | Decoder<unknown>;
|
|
15
|
+
/**
|
|
16
|
+
* @brief infer decoder.
|
|
17
|
+
*/
|
|
18
|
+
export type InferDecoder<TSource> = TSource extends Decoder<infer TValue> ? TValue : TSource extends Guard<infer TValue, infer TPresence> ? RuntimeValue<TValue, TPresence> : never;
|
|
19
|
+
/**
|
|
20
|
+
* @brief decoder.
|
|
21
|
+
*/
|
|
22
|
+
export interface Decoder<TValue> {
|
|
23
|
+
/**
|
|
24
|
+
* @brief decode.
|
|
25
|
+
*/
|
|
26
|
+
decode(value: unknown): CheckResult<TValue>;
|
|
27
|
+
/**
|
|
28
|
+
* @brief transform.
|
|
29
|
+
*/
|
|
30
|
+
transform<TNext>(mapper: (value: TValue) => TNext): BaseDecoder<TNext>;
|
|
31
|
+
/**
|
|
32
|
+
* @brief pipe.
|
|
33
|
+
*/
|
|
34
|
+
pipe<TNext extends DecodeSource>(next: TNext): BaseDecoder<InferDecoder<TNext>>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* @brief base decoder.
|
|
38
|
+
* @details Owns its state directly; methods expose receiver checks and explicit result flow.
|
|
39
|
+
* @invariant Construction leaves the instance in a fully usable state before it escapes.
|
|
40
|
+
*/
|
|
41
|
+
export declare class BaseDecoder<TValue> implements Decoder<TValue> {
|
|
42
|
+
private readonly [DecoderRunSymbol];
|
|
43
|
+
/**
|
|
44
|
+
* @brief constructor.
|
|
45
|
+
* @post The receiver is initialized according to the class invariant before it can be observed.
|
|
46
|
+
*/
|
|
47
|
+
constructor(run: DecodeRunner<TValue>);
|
|
48
|
+
/**
|
|
49
|
+
* @brief decode.
|
|
50
|
+
*/
|
|
51
|
+
decode(this: unknown, value: unknown): CheckResult<TValue>;
|
|
52
|
+
/**
|
|
53
|
+
* @brief transform.
|
|
54
|
+
*/
|
|
55
|
+
transform<TNext>(mapper: (value: TValue) => TNext): BaseDecoder<TNext>;
|
|
56
|
+
/**
|
|
57
|
+
* @brief pipe.
|
|
58
|
+
*/
|
|
59
|
+
pipe<TNext extends DecodeSource>(next: TNext): BaseDecoder<InferDecoder<TNext>>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* @brief decoder.
|
|
63
|
+
*/
|
|
64
|
+
export declare function decoder<TValue, TPresence extends Presence>(source: Guard<TValue, TPresence>): BaseDecoder<RuntimeValue<TValue, TPresence>>;
|
|
65
|
+
/**
|
|
66
|
+
* @brief decoder.
|
|
67
|
+
*/
|
|
68
|
+
export declare function decoder<TValue>(source: Decoder<TValue>): BaseDecoder<TValue>;
|
|
69
|
+
/**
|
|
70
|
+
* @brief transform.
|
|
71
|
+
*/
|
|
72
|
+
export declare function transform<TValue, TPresence extends Presence, TNext>(source: Guard<TValue, TPresence>, mapper: (value: RuntimeValue<TValue, TPresence>) => TNext): BaseDecoder<TNext>;
|
|
73
|
+
/**
|
|
74
|
+
* @brief transform.
|
|
75
|
+
*/
|
|
76
|
+
export declare function transform<TValue, TNext>(source: Decoder<TValue>, mapper: (value: TValue) => TNext): BaseDecoder<TNext>;
|
|
77
|
+
/**
|
|
78
|
+
* @brief pipe.
|
|
79
|
+
*/
|
|
80
|
+
export declare function pipe<TNext extends DecodeSource>(source: DecodeSource, next: TNext): BaseDecoder<InferDecoder<TNext>>;
|
|
81
|
+
/**
|
|
82
|
+
* @brief coerce.
|
|
83
|
+
*/
|
|
84
|
+
export declare const coerce: Readonly<{
|
|
85
|
+
readonly string: typeof coerceString;
|
|
86
|
+
readonly number: typeof coerceNumber;
|
|
87
|
+
readonly boolean: typeof coerceBoolean;
|
|
88
|
+
}>;
|
|
89
|
+
/**
|
|
90
|
+
* @brief coerce string.
|
|
91
|
+
*/
|
|
92
|
+
export declare function coerceString(): BaseDecoder<string>;
|
|
93
|
+
/**
|
|
94
|
+
* @brief coerce number.
|
|
95
|
+
*/
|
|
96
|
+
export declare function coerceNumber(): BaseDecoder<number>;
|
|
97
|
+
/**
|
|
98
|
+
* @brief coerce boolean.
|
|
99
|
+
*/
|
|
100
|
+
export declare function coerceBoolean(): BaseDecoder<boolean>;
|
|
101
|
+
/**
|
|
102
|
+
* @brief is decoder value.
|
|
103
|
+
*/
|
|
104
|
+
export declare function isDecoderValue(value: unknown): value is Decoder<unknown>;
|
|
105
|
+
export {};
|
|
106
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decoder/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { checkSchema } from "../evaluate/index.js";
|
|
2
|
+
import { freezeIssueArray, makeIssue } from "../issue/index.js";
|
|
3
|
+
import { SchemaTag } from "../kind/index.js";
|
|
4
|
+
import { err } from "../result/index.js";
|
|
5
|
+
import { freezeSchema, isSchemaValue } from "../schema/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* @brief decoder run symbol.
|
|
8
|
+
*/
|
|
9
|
+
const DecoderRunSymbol = Symbol("TypeSea.decoder.run");
|
|
10
|
+
/**
|
|
11
|
+
* @brief constructed decoders.
|
|
12
|
+
*/
|
|
13
|
+
const constructedDecoders = new WeakSet();
|
|
14
|
+
/**
|
|
15
|
+
* @brief base decoder.
|
|
16
|
+
* @details Owns its state directly; methods expose receiver checks and explicit result flow.
|
|
17
|
+
* @invariant Construction leaves the instance in a fully usable state before it escapes.
|
|
18
|
+
*/
|
|
19
|
+
export class BaseDecoder {
|
|
20
|
+
/**
|
|
21
|
+
* @brief constructor.
|
|
22
|
+
* @post The receiver is initialized according to the class invariant before it can be observed.
|
|
23
|
+
*/
|
|
24
|
+
constructor(run) {
|
|
25
|
+
if (typeof run !== "function") {
|
|
26
|
+
throw new TypeError("decoder run must be a function");
|
|
27
|
+
}
|
|
28
|
+
defineReadonlyProperty(this, DecoderRunSymbol, run, false);
|
|
29
|
+
constructedDecoders.add(this);
|
|
30
|
+
Object.freeze(this);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* @brief decode.
|
|
34
|
+
*/
|
|
35
|
+
decode(value) {
|
|
36
|
+
return readDecoderRunner(this, "decoder receiver")(value);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* @brief transform.
|
|
40
|
+
*/
|
|
41
|
+
transform(mapper) {
|
|
42
|
+
if (typeof mapper !== "function") {
|
|
43
|
+
throw new TypeError("decoder transform mapper must be a function");
|
|
44
|
+
}
|
|
45
|
+
const run = readDecoderRunner(this, "decoder transform receiver");
|
|
46
|
+
return new BaseDecoder((value) => {
|
|
47
|
+
const decoded = run(value);
|
|
48
|
+
if (!decoded.ok) {
|
|
49
|
+
return decoded;
|
|
50
|
+
}
|
|
51
|
+
return okResult(mapper(decoded.value));
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* @brief pipe.
|
|
56
|
+
*/
|
|
57
|
+
pipe(next) {
|
|
58
|
+
const run = readDecoderRunner(this, "decoder pipe receiver");
|
|
59
|
+
const nextRun = readDecodeSourceRunner(next, "decoder pipe target");
|
|
60
|
+
return new BaseDecoder((value) => {
|
|
61
|
+
const decoded = run(value);
|
|
62
|
+
if (!decoded.ok) {
|
|
63
|
+
return decoded;
|
|
64
|
+
}
|
|
65
|
+
return nextRun(decoded.value);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* @brief decoder.
|
|
71
|
+
*/
|
|
72
|
+
export function decoder(source) {
|
|
73
|
+
return makeDecoder(source);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* @brief make decoder.
|
|
77
|
+
*/
|
|
78
|
+
function makeDecoder(source) {
|
|
79
|
+
const run = readDecodeSourceRunner(source, "decoder source");
|
|
80
|
+
return new BaseDecoder(run);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* @brief transform.
|
|
84
|
+
*/
|
|
85
|
+
export function transform(source, mapper) {
|
|
86
|
+
return makeDecoder(source).transform(mapper);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* @brief pipe.
|
|
90
|
+
*/
|
|
91
|
+
export function pipe(source, next) {
|
|
92
|
+
return makeDecoder(source).pipe(next);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* @brief coerce.
|
|
96
|
+
*/
|
|
97
|
+
export const coerce = Object.freeze({
|
|
98
|
+
string: coerceString,
|
|
99
|
+
number: coerceNumber,
|
|
100
|
+
boolean: coerceBoolean
|
|
101
|
+
});
|
|
102
|
+
/**
|
|
103
|
+
* @brief coerce string.
|
|
104
|
+
*/
|
|
105
|
+
export function coerceString() {
|
|
106
|
+
return new BaseDecoder((value) => {
|
|
107
|
+
switch (typeof value) {
|
|
108
|
+
case "string":
|
|
109
|
+
return okResult(value);
|
|
110
|
+
case "number":
|
|
111
|
+
if (Number.isFinite(value)) {
|
|
112
|
+
return okResult(String(value));
|
|
113
|
+
}
|
|
114
|
+
return fail("expected_string", "string-coercible primitive", value);
|
|
115
|
+
case "bigint":
|
|
116
|
+
case "boolean":
|
|
117
|
+
case "symbol":
|
|
118
|
+
return okResult(String(value));
|
|
119
|
+
default:
|
|
120
|
+
return fail("expected_string", "string-coercible primitive", value);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* @brief coerce number.
|
|
126
|
+
*/
|
|
127
|
+
export function coerceNumber() {
|
|
128
|
+
return new BaseDecoder((value) => {
|
|
129
|
+
if (typeof value === "number") {
|
|
130
|
+
return checkSchema(numberSchema, value);
|
|
131
|
+
}
|
|
132
|
+
if (typeof value !== "string") {
|
|
133
|
+
return fail("expected_number", "number or numeric string", value);
|
|
134
|
+
}
|
|
135
|
+
const trimmed = value.trim();
|
|
136
|
+
if (trimmed.length === 0) {
|
|
137
|
+
return fail("expected_number", "number or numeric string", value);
|
|
138
|
+
}
|
|
139
|
+
return checkSchema(numberSchema, Number(trimmed));
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* @brief coerce boolean.
|
|
144
|
+
*/
|
|
145
|
+
export function coerceBoolean() {
|
|
146
|
+
return new BaseDecoder((value) => {
|
|
147
|
+
if (typeof value === "boolean") {
|
|
148
|
+
return okResult(value);
|
|
149
|
+
}
|
|
150
|
+
if (typeof value !== "string") {
|
|
151
|
+
return fail("expected_boolean", "boolean or boolean string", value);
|
|
152
|
+
}
|
|
153
|
+
const lowered = value.trim().toLowerCase();
|
|
154
|
+
if (lowered === "true") {
|
|
155
|
+
return okResult(true);
|
|
156
|
+
}
|
|
157
|
+
if (lowered === "false") {
|
|
158
|
+
return okResult(false);
|
|
159
|
+
}
|
|
160
|
+
return fail("expected_boolean", "boolean or boolean string", value);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* @brief is decoder value.
|
|
165
|
+
*/
|
|
166
|
+
export function isDecoderValue(value) {
|
|
167
|
+
return isConstructedDecoder(value);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* @brief is constructed decoder.
|
|
171
|
+
*/
|
|
172
|
+
function isConstructedDecoder(value) {
|
|
173
|
+
return isRecord(value) && constructedDecoders.has(value);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* @brief read decode source runner.
|
|
177
|
+
*/
|
|
178
|
+
function readDecodeSourceRunner(source, label) {
|
|
179
|
+
if (isConstructedDecoder(source)) {
|
|
180
|
+
return readDecoderRunner(source, label);
|
|
181
|
+
}
|
|
182
|
+
const schema = readGuardSchema(source, label);
|
|
183
|
+
return (value) => checkSchema(schema, value);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* @brief read decoder runner.
|
|
187
|
+
*/
|
|
188
|
+
function readDecoderRunner(value, label) {
|
|
189
|
+
if (!isConstructedDecoder(value)) {
|
|
190
|
+
throw new TypeError(`${label} must be a TypeSea decoder`);
|
|
191
|
+
}
|
|
192
|
+
return value[DecoderRunSymbol];
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* @brief read guard schema.
|
|
196
|
+
*/
|
|
197
|
+
function readGuardSchema(value, label) {
|
|
198
|
+
if (!isRecord(value)) {
|
|
199
|
+
throw new TypeError(`${label} must be a TypeSea guard or decoder`);
|
|
200
|
+
}
|
|
201
|
+
const schema = value["schema"];
|
|
202
|
+
if (!isSchemaValue(schema)) {
|
|
203
|
+
throw new TypeError(`${label} must contain a valid TypeSea schema`);
|
|
204
|
+
}
|
|
205
|
+
return freezeSchema(schema);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* @brief ok result.
|
|
209
|
+
*/
|
|
210
|
+
function okResult(value) {
|
|
211
|
+
return Object.freeze({
|
|
212
|
+
ok: true,
|
|
213
|
+
value
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* @brief fail.
|
|
218
|
+
*/
|
|
219
|
+
function fail(code, expected, value) {
|
|
220
|
+
return err(freezeIssueArray([
|
|
221
|
+
makeIssue([], code, expected, actualType(value), undefined)
|
|
222
|
+
]));
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* @brief actual type.
|
|
226
|
+
*/
|
|
227
|
+
function actualType(value) {
|
|
228
|
+
if (value === null) {
|
|
229
|
+
return "null";
|
|
230
|
+
}
|
|
231
|
+
if (Array.isArray(value)) {
|
|
232
|
+
return "array";
|
|
233
|
+
}
|
|
234
|
+
if (typeof value === "number" && Number.isNaN(value)) {
|
|
235
|
+
return "nan";
|
|
236
|
+
}
|
|
237
|
+
return typeof value;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* @brief define readonly property.
|
|
241
|
+
*/
|
|
242
|
+
function defineReadonlyProperty(target, key, value, enumerable) {
|
|
243
|
+
Object.defineProperty(target, key, {
|
|
244
|
+
configurable: false,
|
|
245
|
+
enumerable,
|
|
246
|
+
value,
|
|
247
|
+
writable: false
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* @brief is record.
|
|
252
|
+
*/
|
|
253
|
+
function isRecord(value) {
|
|
254
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* @brief number schema.
|
|
258
|
+
*/
|
|
259
|
+
const numberSchema = Object.freeze({
|
|
260
|
+
tag: SchemaTag.Number,
|
|
261
|
+
checks: Object.freeze([])
|
|
262
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file check-composite.ts
|
|
3
|
+
* @brief Composite diagnostic schema interpreters.
|
|
4
|
+
*/
|
|
5
|
+
import { SchemaTag } from "../kind/index.js";
|
|
6
|
+
import type { Issue, PathSegment } from "../issue/index.js";
|
|
7
|
+
import type { DiscriminatedUnionCase, Schema } from "../schema/index.js";
|
|
8
|
+
import type { ValidationState } from "./state.js";
|
|
9
|
+
/**
|
|
10
|
+
* @brief issue collector.
|
|
11
|
+
*/
|
|
12
|
+
export type IssueCollector = (schema: Schema, value: unknown, path: PathSegment[], issues: Issue[], state: ValidationState) => void;
|
|
13
|
+
/**
|
|
14
|
+
* @brief collect array issues.
|
|
15
|
+
*/
|
|
16
|
+
export declare function collectArrayIssues(item: Schema, value: unknown, path: PathSegment[], issues: Issue[], state: ValidationState, collectChild: IssueCollector): void;
|
|
17
|
+
/**
|
|
18
|
+
* @brief collect tuple issues.
|
|
19
|
+
*/
|
|
20
|
+
export declare function collectTupleIssues(items: readonly Schema[], value: unknown, path: PathSegment[], issues: Issue[], state: ValidationState, collectChild: IssueCollector): void;
|
|
21
|
+
/**
|
|
22
|
+
* @brief collect record issues.
|
|
23
|
+
*/
|
|
24
|
+
export declare function collectRecordIssues(item: Schema, value: unknown, path: PathSegment[], issues: Issue[], state: ValidationState, collectChild: IssueCollector): void;
|
|
25
|
+
/**
|
|
26
|
+
* @brief collect object issues.
|
|
27
|
+
*/
|
|
28
|
+
export declare function collectObjectIssues(schema: Extract<Schema, {
|
|
29
|
+
readonly tag: typeof SchemaTag.Object;
|
|
30
|
+
}>, value: unknown, path: PathSegment[], issues: Issue[], state: ValidationState, collectChild: IssueCollector): void;
|
|
31
|
+
/**
|
|
32
|
+
* @brief collect discriminated union issues.
|
|
33
|
+
*/
|
|
34
|
+
export declare function collectDiscriminatedUnionIssues(key: string, cases: readonly DiscriminatedUnionCase[], value: unknown, path: PathSegment[], issues: Issue[], state: ValidationState, collectChild: IssueCollector): void;
|
|
35
|
+
/**
|
|
36
|
+
* @brief collect refine issues.
|
|
37
|
+
*/
|
|
38
|
+
export declare function collectRefineIssues(inner: Schema, predicate: (value: unknown) => boolean, name: string, value: unknown, path: PathSegment[], issues: Issue[], state: ValidationState, collectChild: IssueCollector): void;
|
|
39
|
+
//# sourceMappingURL=check-composite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-composite.d.ts","sourceRoot":"","sources":["../../src/evaluate/check-composite.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,SAAS,EACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EACV,sBAAsB,EACtB,MAAM,EACP,MAAM,oBAAoB,CAAC;AAa5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,WAAW,EAAE,EACnB,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,eAAe,KACnB,IAAI,CAAC;AAEV;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,WAAW,EAAE,EACnB,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,cAAc,GAC3B,IAAI,CAqBN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,WAAW,EAAE,EACnB,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,cAAc,GAC3B,IAAI,CAmCN;AAwBD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,WAAW,EAAE,EACnB,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,cAAc,GAC3B,IAAI,CAoBN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,SAAS,CAAC,MAAM,CAAA;CAAE,CAAC,EAClE,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,WAAW,EAAE,EACnB,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,cAAc,GAC3B,IAAI,CA6CN;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,SAAS,sBAAsB,EAAE,EACxC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,WAAW,EAAE,EACnB,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,cAAc,GAC3B,IAAI,CAuCN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,EACtC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,WAAW,EAAE,EACnB,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,cAAc,GAC3B,IAAI,CAMN"}
|