@blockml/framework 0.8.1 → 0.9.1
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/blocks/org/blockml/bml/framework/Library.bml +7 -1
- package/blocks/org/blockml/bml/framework/capability/EvaluateExpression.bml +50 -0
- package/blocks/org/blockml/bml/framework/capability/EvaluateInterpolatedText.bml +50 -0
- package/blocks/org/blockml/bml/framework/capability/FindLocalMember.bml +58 -0
- package/blocks/org/blockml/bml/framework/capability/ParseInterpolatedText.bml +54 -0
- package/blocks/org/blockml/bml/framework/capability/ValidateGenerics.bml +66 -0
- package/blocks/org/blockml/bml/framework/config/FrameworkDiagnosticCodes.bml +1 -1
- package/blocks/org/blockml/bml/framework/documentation/Diagnostics.bml +11 -0
- package/blocks/org/blockml/bml/framework/documentation/EffectiveMembers.bml +2 -0
- package/blocks/org/blockml/bml/framework/documentation/ExpressionParsing.bml +6 -3
- package/blocks/org/blockml/bml/framework/documentation/PublicApi.bml +6 -0
- package/blocks/org/blockml/bml/framework/documentation/TypeRegistryBootstrap.bml +1 -1
- package/blocks/org/blockml/bml/framework/expression/ExpressionNode.bml +1 -1
- package/blocks/org/blockml/bml/framework/expression/InterpolatedStringNode.bml +51 -0
- package/dist/expression/evaluate-expression.d.ts +9 -0
- package/dist/expression/evaluate-expression.d.ts.map +1 -0
- package/dist/expression/evaluate-expression.js +124 -0
- package/dist/expression/evaluate-expression.js.map +1 -0
- package/dist/expression/parse-interpolated-text.d.ts +3 -0
- package/dist/expression/parse-interpolated-text.d.ts.map +1 -0
- package/dist/expression/parse-interpolated-text.js +80 -0
- package/dist/expression/parse-interpolated-text.js.map +1 -0
- package/dist/expression/restricted.d.ts +5 -0
- package/dist/expression/restricted.d.ts.map +1 -0
- package/dist/expression/restricted.js +65 -0
- package/dist/expression/restricted.js.map +1 -0
- package/dist/expression/types.d.ts +5 -1
- package/dist/expression/types.d.ts.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/resolve/resolve-generic-application.d.ts +18 -0
- package/dist/resolve/resolve-generic-application.d.ts.map +1 -0
- package/dist/resolve/resolve-generic-application.js +129 -0
- package/dist/resolve/resolve-generic-application.js.map +1 -0
- package/dist/resolve/satisfies-type-bound.d.ts +4 -0
- package/dist/resolve/satisfies-type-bound.d.ts.map +1 -0
- package/dist/resolve/satisfies-type-bound.js +20 -0
- package/dist/resolve/satisfies-type-bound.js.map +1 -0
- package/dist/validate/validate-generics.d.ts +4 -0
- package/dist/validate/validate-generics.d.ts.map +1 -0
- package/dist/validate/validate-generics.js +141 -0
- package/dist/validate/validate-generics.js.map +1 -0
- package/dist/validate/validate-types.d.ts.map +1 -1
- package/dist/validate/validate-types.js +125 -25
- package/dist/validate/validate-types.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { parseExpression } from "./parse-expression.js";
|
|
2
|
+
import { holeLooksLikeModelBinding, INTERPOLATION_NOT_ALLOWED, restrictedExpressionError, } from "./restricted.js";
|
|
3
|
+
function findMatchingBrace(input, start) {
|
|
4
|
+
let depth = 1;
|
|
5
|
+
let quote = null;
|
|
6
|
+
for (let i = start; i < input.length; i++) {
|
|
7
|
+
const ch = input[i];
|
|
8
|
+
if (quote) {
|
|
9
|
+
if (ch === "\\" && i + 1 < input.length) {
|
|
10
|
+
i++;
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
if (ch === quote) {
|
|
14
|
+
quote = null;
|
|
15
|
+
}
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (ch === '"' || ch === "'") {
|
|
19
|
+
quote = ch;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (ch === "{") {
|
|
23
|
+
depth++;
|
|
24
|
+
}
|
|
25
|
+
else if (ch === "}") {
|
|
26
|
+
depth--;
|
|
27
|
+
if (depth === 0) {
|
|
28
|
+
return i;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return -1;
|
|
33
|
+
}
|
|
34
|
+
export function parseInterpolatedText(raw) {
|
|
35
|
+
const parts = [];
|
|
36
|
+
let i = 0;
|
|
37
|
+
let literal = "";
|
|
38
|
+
while (i < raw.length) {
|
|
39
|
+
if (raw[i] === "\\" && raw.slice(i, i + 3) === "\\${") {
|
|
40
|
+
literal += "${";
|
|
41
|
+
i += 3;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (raw[i] === "$" && raw[i + 1] === "{") {
|
|
45
|
+
if (literal) {
|
|
46
|
+
parts.push({ kind: "literal", value: literal });
|
|
47
|
+
literal = "";
|
|
48
|
+
}
|
|
49
|
+
const end = findMatchingBrace(raw, i + 2);
|
|
50
|
+
if (end < 0) {
|
|
51
|
+
return { ok: false, error: { message: "Unclosed interpolation", offset: i } };
|
|
52
|
+
}
|
|
53
|
+
const hole = raw.slice(i + 2, end);
|
|
54
|
+
if (holeLooksLikeModelBinding(hole)) {
|
|
55
|
+
return {
|
|
56
|
+
ok: false,
|
|
57
|
+
error: { message: INTERPOLATION_NOT_ALLOWED, offset: i },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const parsed = parseExpression(hole);
|
|
61
|
+
if (!parsed.ok) {
|
|
62
|
+
return parsed;
|
|
63
|
+
}
|
|
64
|
+
const restricted = restrictedExpressionError(parsed.result.ast);
|
|
65
|
+
if (restricted) {
|
|
66
|
+
return { ok: false, error: { message: restricted, offset: i } };
|
|
67
|
+
}
|
|
68
|
+
parts.push(parsed.result.ast);
|
|
69
|
+
i = end + 1;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
literal += raw[i];
|
|
73
|
+
i++;
|
|
74
|
+
}
|
|
75
|
+
if (literal) {
|
|
76
|
+
parts.push({ kind: "literal", value: literal });
|
|
77
|
+
}
|
|
78
|
+
return { ok: true, result: { ast: { kind: "interpolated", parts } } };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=parse-interpolated-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-interpolated-text.js","sourceRoot":"","sources":["../../src/expression/parse-interpolated-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC;AAGzB,SAAS,iBAAiB,CAAC,KAAa,EAAE,KAAa;IACrD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACxC,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;gBACjB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,KAAK,GAAG,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,KAAK,EAAE,CAAC;QACV,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,OAAO,CAAC,CAAC;YACX,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YACtD,OAAO,IAAI,IAAI,CAAC;YAChB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACzC,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBAChD,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;YACD,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1C,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChF,CAAC;YACD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;YACnC,IAAI,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAC,EAAE;iBACzD,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,UAAU,GAAG,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChE,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;YACZ,SAAS;QACX,CAAC;QACD,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,EAAE,CAAC;IACN,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ExpressionNode } from "./types.js";
|
|
2
|
+
export declare const INTERPOLATION_NOT_ALLOWED = "not allowed in interpolated text";
|
|
3
|
+
export declare function restrictedExpressionError(node: ExpressionNode): string | undefined;
|
|
4
|
+
export declare function holeLooksLikeModelBinding(raw: string): boolean;
|
|
5
|
+
//# sourceMappingURL=restricted.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restricted.d.ts","sourceRoot":"","sources":["../../src/expression/restricted.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,yBAAyB,qCACF,CAAC;AAIrC,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAyDlF;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9D"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export const INTERPOLATION_NOT_ALLOWED = "not allowed in interpolated text";
|
|
2
|
+
const ALLOWED_CALL = /^#(math|strings)\./;
|
|
3
|
+
export function restrictedExpressionError(node) {
|
|
4
|
+
switch (node.kind) {
|
|
5
|
+
case "literal":
|
|
6
|
+
return undefined;
|
|
7
|
+
case "binary":
|
|
8
|
+
if (node.operator !== "+") {
|
|
9
|
+
return INTERPOLATION_NOT_ALLOWED;
|
|
10
|
+
}
|
|
11
|
+
return (restrictedExpressionError(node.left) ?? restrictedExpressionError(node.right));
|
|
12
|
+
case "property": {
|
|
13
|
+
const head = propertyPathHead(node.path);
|
|
14
|
+
if (head.startsWith("@")) {
|
|
15
|
+
return INTERPOLATION_NOT_ALLOWED;
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
case "call": {
|
|
20
|
+
if (!ALLOWED_CALL.test(node.callee)) {
|
|
21
|
+
return INTERPOLATION_NOT_ALLOWED;
|
|
22
|
+
}
|
|
23
|
+
for (const arg of node.args) {
|
|
24
|
+
const err = restrictedExpressionError(arg);
|
|
25
|
+
if (err) {
|
|
26
|
+
return err;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
case "array":
|
|
32
|
+
for (const el of node.elements) {
|
|
33
|
+
const err = restrictedExpressionError(el);
|
|
34
|
+
if (err) {
|
|
35
|
+
return err;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
case "object":
|
|
40
|
+
for (const el of Object.values(node.entries)) {
|
|
41
|
+
const err = restrictedExpressionError(el);
|
|
42
|
+
if (err) {
|
|
43
|
+
return err;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
case "interpolated":
|
|
48
|
+
for (const part of node.parts) {
|
|
49
|
+
const err = restrictedExpressionError(part);
|
|
50
|
+
if (err) {
|
|
51
|
+
return err;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
default:
|
|
56
|
+
return INTERPOLATION_NOT_ALLOWED;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function holeLooksLikeModelBinding(raw) {
|
|
60
|
+
return /@[A-Za-z_]\w*\s*:/.test(raw);
|
|
61
|
+
}
|
|
62
|
+
function propertyPathHead(path) {
|
|
63
|
+
return path.flatMap((seg) => seg.split(".")).filter(Boolean)[0] ?? "";
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=restricted.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restricted.js","sourceRoot":"","sources":["../../src/expression/restricted.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,yBAAyB,GACpC,kCAAkC,CAAC;AAErC,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAE1C,MAAM,UAAU,yBAAyB,CAAC,IAAoB;IAC5D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ;YACX,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;gBAC1B,OAAO,yBAAyB,CAAC;YACnC,CAAC;YACD,OAAO,CACL,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAC9E,CAAC;QACJ,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO,yBAAyB,CAAC;YACnC,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpC,OAAO,yBAAyB,CAAC;YACnC,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;gBAC3C,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,GAAG,CAAC;gBACb,CAAC;YACH,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,KAAK,OAAO;YACV,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,yBAAyB,CAAC,EAAE,CAAC,CAAC;gBAC1C,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,GAAG,CAAC;gBACb,CAAC;YACH,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ;YACX,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7C,MAAM,GAAG,GAAG,yBAAyB,CAAC,EAAE,CAAC,CAAC;gBAC1C,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,GAAG,CAAC;gBACb,CAAC;YACH,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,KAAK,cAAc;YACjB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,MAAM,GAAG,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,GAAG,CAAC;gBACb,CAAC;YACH,CAAC;YACD,OAAO,SAAS,CAAC;QACnB;YACE,OAAO,yBAAyB,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,OAAO,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACxE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type ExpressionNode = LiteralExpressionNode | ArrayExpressionNode | ObjectExpressionNode | PropertyExpressionNode | CallExpressionNode | BinaryExpressionNode;
|
|
1
|
+
export type ExpressionNode = LiteralExpressionNode | ArrayExpressionNode | ObjectExpressionNode | PropertyExpressionNode | CallExpressionNode | BinaryExpressionNode | InterpolatedStringNode;
|
|
2
2
|
export interface BinaryExpressionNode {
|
|
3
3
|
kind: "binary";
|
|
4
4
|
operator: "+" | "-" | "*" | "/";
|
|
@@ -26,6 +26,10 @@ export interface CallExpressionNode {
|
|
|
26
26
|
callee: string;
|
|
27
27
|
args: ExpressionNode[];
|
|
28
28
|
}
|
|
29
|
+
export interface InterpolatedStringNode {
|
|
30
|
+
kind: "interpolated";
|
|
31
|
+
parts: ExpressionNode[];
|
|
32
|
+
}
|
|
29
33
|
export interface ParseExpressionResult {
|
|
30
34
|
ast: ExpressionNode;
|
|
31
35
|
resultTypeFqn?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/expression/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GACtB,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,GACpB,sBAAsB,GACtB,kBAAkB,GAClB,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/expression/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GACtB,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,GACpB,sBAAsB,GACtB,kBAAkB,GAClB,oBAAoB,GACpB,sBAAsB,CAAC;AAE3B,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAChC,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,cAAc,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,cAAc,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,cAAc,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAA;CAAE,GAC3C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,14 +5,18 @@ export { rootFqnByFilePath, rootFqns } from "./registry/root-fqn.js";
|
|
|
5
5
|
export { getExportedFqns } from "./registry/library-exports.js";
|
|
6
6
|
export { peekLibraryTypeFqn } from "./registry/library-bootstrap.js";
|
|
7
7
|
export { forkBom } from "./fork/fork-bom.js";
|
|
8
|
-
export { resolveEffectiveMembers, resolveContracts, collectBaseTypeChain, memberIdentityKey, } from "./resolve/resolve-effective-members.js";
|
|
8
|
+
export { resolveEffectiveMembers, resolveContracts, collectBaseTypeChain, memberIdentityKey, findLocalMember, } from "./resolve/resolve-effective-members.js";
|
|
9
9
|
export { parseExpression } from "./expression/parse-expression.js";
|
|
10
|
-
export
|
|
10
|
+
export { parseInterpolatedText } from "./expression/parse-interpolated-text.js";
|
|
11
|
+
export { evaluateExpression, evaluateInterpolatedText, ExpressionEvaluationError, } from "./expression/evaluate-expression.js";
|
|
12
|
+
export type { ExpressionScope } from "./expression/evaluate-expression.js";
|
|
13
|
+
export type { ExpressionNode, InterpolatedStringNode, ParseExpressionResult, ParseExpressionOutcome, } from "./expression/types.js";
|
|
11
14
|
export { validateTypes, getPropertyNumericValue, isLiteralValue, } from "./validate/validate-types.js";
|
|
12
15
|
export { validateVersions } from "./validate/validate-versions.js";
|
|
13
16
|
export { validateConstraints } from "./validate/validate-constraints.js";
|
|
14
17
|
export { validateEmbeddedBlocks } from "./validate/validate-embedded-blocks.js";
|
|
15
18
|
export { validateInstances } from "./validate/validate-instances.js";
|
|
19
|
+
export { validateGenerics } from "./validate/validate-generics.js";
|
|
16
20
|
export { validatePresets } from "./validate/validate-presets.js";
|
|
17
21
|
export { validateVisibility } from "./validate/validate-visibility.js";
|
|
18
22
|
export { validateReadOnly } from "./validate/validate-readonly.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,GAChB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,YAAY,EACV,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,cAAc,GACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,13 +5,16 @@ export { rootFqnByFilePath, rootFqns } from "./registry/root-fqn.js";
|
|
|
5
5
|
export { getExportedFqns } from "./registry/library-exports.js";
|
|
6
6
|
export { peekLibraryTypeFqn } from "./registry/library-bootstrap.js";
|
|
7
7
|
export { forkBom } from "./fork/fork-bom.js";
|
|
8
|
-
export { resolveEffectiveMembers, resolveContracts, collectBaseTypeChain, memberIdentityKey, } from "./resolve/resolve-effective-members.js";
|
|
8
|
+
export { resolveEffectiveMembers, resolveContracts, collectBaseTypeChain, memberIdentityKey, findLocalMember, } from "./resolve/resolve-effective-members.js";
|
|
9
9
|
export { parseExpression } from "./expression/parse-expression.js";
|
|
10
|
+
export { parseInterpolatedText } from "./expression/parse-interpolated-text.js";
|
|
11
|
+
export { evaluateExpression, evaluateInterpolatedText, ExpressionEvaluationError, } from "./expression/evaluate-expression.js";
|
|
10
12
|
export { validateTypes, getPropertyNumericValue, isLiteralValue, } from "./validate/validate-types.js";
|
|
11
13
|
export { validateVersions } from "./validate/validate-versions.js";
|
|
12
14
|
export { validateConstraints } from "./validate/validate-constraints.js";
|
|
13
15
|
export { validateEmbeddedBlocks } from "./validate/validate-embedded-blocks.js";
|
|
14
16
|
export { validateInstances } from "./validate/validate-instances.js";
|
|
17
|
+
export { validateGenerics } from "./validate/validate-generics.js";
|
|
15
18
|
export { validatePresets } from "./validate/validate-presets.js";
|
|
16
19
|
export { validateVisibility } from "./validate/validate-visibility.js";
|
|
17
20
|
export { validateReadOnly } from "./validate/validate-readonly.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,EACrB,mBAAmB,GAIpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,EACrB,mBAAmB,GAIpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,GAChB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,qCAAqC,CAAC;AAQ7C,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,cAAc,GACf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { GenericType, TypeExpression } from "@blockml/bom";
|
|
2
|
+
import type { TypeRegistry } from "../registry/type-registry.js";
|
|
3
|
+
export type GenericApplicationDiagnostic = {
|
|
4
|
+
code: "BML_GENERICS_ARGUMENT_MISMATCH" | "BML_MISSING_GENERIC_TYPE_ARGUMENT" | "BML_GENERIC_CONSTRAINT_VIOLATION";
|
|
5
|
+
message: string;
|
|
6
|
+
};
|
|
7
|
+
export type GenericApplicationResult = {
|
|
8
|
+
bindings: Map<string, TypeExpression>;
|
|
9
|
+
diagnostics: GenericApplicationDiagnostic[];
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Bind authored type arguments to declared genericTypes.
|
|
13
|
+
* Authored args win; remaining parameters take defaultType in declaration order.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveGenericApplication(params: GenericType[], authoredArgs: TypeExpression[], registry: TypeRegistry, namespaceBindings?: Record<string, string>): GenericApplicationResult;
|
|
16
|
+
/** Parameters that do not ground from defaultType alone — the instance is open. */
|
|
17
|
+
export declare function openGenericParameters(params: GenericType[], namespaceBindings?: Record<string, string>): GenericType[];
|
|
18
|
+
//# sourceMappingURL=resolve-generic-application.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-generic-application.d.ts","sourceRoot":"","sources":["../../src/resolve/resolve-generic-application.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EACA,gCAAgC,GAChC,mCAAmC,GACnC,kCAAkC,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtC,WAAW,EAAE,4BAA4B,EAAE,CAAC;CAC7C,CAAC;AAoFF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,WAAW,EAAE,EACrB,YAAY,EAAE,cAAc,EAAE,EAC9B,QAAQ,EAAE,YAAY,EACtB,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAC7C,wBAAwB,CAkD1B;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EAAE,EACrB,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAC7C,WAAW,EAAE,CAkBf"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { parseTypeExpression } from "@blockml/parser";
|
|
2
|
+
import { satisfiesTypeBound } from "./satisfies-type-bound.js";
|
|
3
|
+
function namedFqns(expr) {
|
|
4
|
+
switch (expr.kind) {
|
|
5
|
+
case "named":
|
|
6
|
+
return [expr.fqn];
|
|
7
|
+
case "union":
|
|
8
|
+
return expr.alternatives.flatMap(namedFqns);
|
|
9
|
+
case "grouped":
|
|
10
|
+
return namedFqns(expr.expression);
|
|
11
|
+
default:
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function isConcreteType(expr) {
|
|
16
|
+
switch (expr.kind) {
|
|
17
|
+
case "named":
|
|
18
|
+
return true;
|
|
19
|
+
case "union":
|
|
20
|
+
return expr.alternatives.every(isConcreteType);
|
|
21
|
+
case "grouped":
|
|
22
|
+
return isConcreteType(expr.expression);
|
|
23
|
+
default:
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function resolveDefaultType(param, params, resolved, bindings, visiting) {
|
|
28
|
+
const raw = param.defaultType?.trim();
|
|
29
|
+
if (!raw) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
if (visiting.has(param.name)) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
visiting.add(param.name);
|
|
36
|
+
let expr;
|
|
37
|
+
try {
|
|
38
|
+
expr = parseTypeExpression(raw, bindings, "type");
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
visiting.delete(param.name);
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
if (expr.kind === "genericParam") {
|
|
45
|
+
const sibling = resolved.get(expr.name);
|
|
46
|
+
if (sibling) {
|
|
47
|
+
visiting.delete(param.name);
|
|
48
|
+
return sibling;
|
|
49
|
+
}
|
|
50
|
+
const earlier = params.find((p) => p.name === expr.name);
|
|
51
|
+
if (!earlier || params.indexOf(earlier) >= params.indexOf(param)) {
|
|
52
|
+
visiting.delete(param.name);
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const fromSibling = resolveDefaultType(earlier, params, resolved, bindings, visiting);
|
|
56
|
+
visiting.delete(param.name);
|
|
57
|
+
return fromSibling;
|
|
58
|
+
}
|
|
59
|
+
visiting.delete(param.name);
|
|
60
|
+
return isConcreteType(expr) ? expr : undefined;
|
|
61
|
+
}
|
|
62
|
+
function argumentSatisfiesBound(arg, boundFqn, registry) {
|
|
63
|
+
const fqns = namedFqns(arg);
|
|
64
|
+
if (fqns.length === 0) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return fqns.every((fqn) => satisfiesTypeBound(fqn, boundFqn, registry));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Bind authored type arguments to declared genericTypes.
|
|
71
|
+
* Authored args win; remaining parameters take defaultType in declaration order.
|
|
72
|
+
*/
|
|
73
|
+
export function resolveGenericApplication(params, authoredArgs, registry, namespaceBindings = {}) {
|
|
74
|
+
const diagnostics = [];
|
|
75
|
+
const bindings = new Map();
|
|
76
|
+
if (authoredArgs.length > params.length) {
|
|
77
|
+
diagnostics.push({
|
|
78
|
+
code: "BML_GENERICS_ARGUMENT_MISMATCH",
|
|
79
|
+
message: `bml:generics has ${authoredArgs.length} argument(s); expected at most ${params.length}`,
|
|
80
|
+
});
|
|
81
|
+
return { bindings, diagnostics };
|
|
82
|
+
}
|
|
83
|
+
for (let i = 0; i < params.length; i++) {
|
|
84
|
+
const param = params[i];
|
|
85
|
+
const authored = authoredArgs[i];
|
|
86
|
+
if (authored) {
|
|
87
|
+
bindings.set(param.name, authored);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const fallback = resolveDefaultType(param, params, bindings, namespaceBindings, new Set());
|
|
91
|
+
if (fallback) {
|
|
92
|
+
bindings.set(param.name, fallback);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
diagnostics.push({
|
|
96
|
+
code: "BML_MISSING_GENERIC_TYPE_ARGUMENT",
|
|
97
|
+
message: `Missing generic type argument for ${param.name}`,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
for (const param of params) {
|
|
101
|
+
const bound = bindings.get(param.name);
|
|
102
|
+
if (!bound) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (!argumentSatisfiesBound(bound, param.baseType, registry)) {
|
|
106
|
+
diagnostics.push({
|
|
107
|
+
code: "BML_GENERIC_CONSTRAINT_VIOLATION",
|
|
108
|
+
message: `Type argument for ${param.name} does not satisfy bound ${param.baseType}`,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { bindings, diagnostics };
|
|
113
|
+
}
|
|
114
|
+
/** Parameters that do not ground from defaultType alone — the instance is open. */
|
|
115
|
+
export function openGenericParameters(params, namespaceBindings = {}) {
|
|
116
|
+
const resolved = new Map();
|
|
117
|
+
const open = [];
|
|
118
|
+
for (const param of params) {
|
|
119
|
+
const fallback = resolveDefaultType(param, params, resolved, namespaceBindings, new Set());
|
|
120
|
+
if (fallback) {
|
|
121
|
+
resolved.set(param.name, fallback);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
open.push(param);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return open;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=resolve-generic-application.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-generic-application.js","sourceRoot":"","sources":["../../src/resolve/resolve-generic-application.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TypeRegistry } from "../registry/type-registry.js";
|
|
2
|
+
/** G on T's baseType chain, or G ∈ T.contracts[] (direct only). */
|
|
3
|
+
export declare function satisfiesTypeBound(typeFqn: string, boundFqn: string, registry: TypeRegistry): boolean;
|
|
4
|
+
//# sourceMappingURL=satisfies-type-bound.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"satisfies-type-bound.d.ts","sourceRoot":"","sources":["../../src/resolve/satisfies-type-bound.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,mEAAmE;AACnE,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAgBT"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { collectBaseTypeChain } from "./resolve-effective-members.js";
|
|
2
|
+
/** G on T's baseType chain, or G ∈ T.contracts[] (direct only). */
|
|
3
|
+
export function satisfiesTypeBound(typeFqn, boundFqn, registry) {
|
|
4
|
+
if (typeFqn === boundFqn) {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
const start = registry.get(typeFqn)?.block;
|
|
8
|
+
if (!start) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
if ((start.contracts ?? []).some((c) => c.value === boundFqn)) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
const chain = collectBaseTypeChain(start, registry);
|
|
15
|
+
if (chain.some((b) => b.type === boundFqn)) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
return chain[0]?.baseType === boundFqn;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=satisfies-type-bound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"satisfies-type-bound.js","sourceRoot":"","sources":["../../src/resolve/satisfies-type-bound.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,mEAAmE;AACnE,MAAM,UAAU,kBAAkB,CAChC,OAAe,EACf,QAAgB,EAChB,QAAsB;IAEtB,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC;IAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,QAAQ,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { BomDocument, Diagnostic } from "@blockml/bom";
|
|
2
|
+
import type { TypeRegistry } from "../registry/type-registry.js";
|
|
3
|
+
export declare function validateGenerics(document: BomDocument, registry: TypeRegistry): Diagnostic[];
|
|
4
|
+
//# sourceMappingURL=validate-generics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-generics.d.ts","sourceRoot":"","sources":["../../src/validate/validate-generics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EAGX,UAAU,EAKX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAmQjE,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,YAAY,GACrB,UAAU,EAAE,CAKd"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { resolveEffectiveMembers } from "../resolve/resolve-effective-members.js";
|
|
2
|
+
import { openGenericParameters, resolveGenericApplication, } from "../resolve/resolve-generic-application.js";
|
|
3
|
+
const TYPE_REFERENCE_ENTITY = "org.blockml.bml.type.TypeReferenceEntity";
|
|
4
|
+
function diag(code, message, file, loc) {
|
|
5
|
+
return {
|
|
6
|
+
severity: "error",
|
|
7
|
+
code,
|
|
8
|
+
message,
|
|
9
|
+
source: {
|
|
10
|
+
file: loc?.file ?? file,
|
|
11
|
+
line: loc?.line ?? 1,
|
|
12
|
+
column: loc?.column ?? 1,
|
|
13
|
+
...(loc?.endLine !== undefined ? { endLine: loc.endLine } : {}),
|
|
14
|
+
...(loc?.endColumn !== undefined ? { endColumn: loc.endColumn } : {}),
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function reportNotAllowed(binding, file, diagnostics) {
|
|
19
|
+
diagnostics.push(diag("BML_GENERICS_DIRECTIVE_NOT_ALLOWED", "bml:generics is only allowed on Block instances", file, binding.source));
|
|
20
|
+
}
|
|
21
|
+
function isTypeReferenceEntityType(expr) {
|
|
22
|
+
if (!expr) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
if (expr.kind === "grouped") {
|
|
26
|
+
return isTypeReferenceEntityType(expr.expression);
|
|
27
|
+
}
|
|
28
|
+
return expr.kind === "named" && expr.fqn === TYPE_REFERENCE_ENTITY;
|
|
29
|
+
}
|
|
30
|
+
function aggregationIsTypeReferenceEntity(owner, aggregationName, registry) {
|
|
31
|
+
if (!owner) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
const member = resolveEffectiveMembers(owner, registry).find((m) => m.kind === "aggregation" && m.name === aggregationName);
|
|
35
|
+
return member?.kind === "aggregation" && isTypeReferenceEntityType(member.type);
|
|
36
|
+
}
|
|
37
|
+
function validateInstanceGenerics(instance, registry, file, diagnostics) {
|
|
38
|
+
const typeDoc = registry.get(instance.typeFqn);
|
|
39
|
+
const params = typeDoc?.block.genericTypes ?? [];
|
|
40
|
+
const typeBindings = typeDoc?.source.namespaceBindings ?? {};
|
|
41
|
+
const open = openGenericParameters(params, typeBindings);
|
|
42
|
+
const binding = instance.generics;
|
|
43
|
+
if (!binding) {
|
|
44
|
+
if (open.length > 0) {
|
|
45
|
+
diagnostics.push(diag("BML_OPEN_GENERIC_INSTANCE", `Instance of ${instance.typeFqn} has open genericTypes and requires bml:generics`, file, instance.source));
|
|
46
|
+
}
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (params.length === 0) {
|
|
50
|
+
diagnostics.push(diag("BML_GENERICS_ARGUMENT_MISMATCH", `bml:generics is not applicable; ${instance.typeFqn} has no genericTypes`, file, binding.source));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (binding.arguments === undefined) {
|
|
54
|
+
const raw = binding.raw.trim();
|
|
55
|
+
if (raw.startsWith("(") && raw.endsWith(")")) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
diagnostics.push(diag("BML_GENERICS_ARGUMENT_MISMATCH", "bml:generics must be a parenthesized TypeExpression list", file, binding.source));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const resolved = resolveGenericApplication(params, binding.arguments, registry, typeBindings);
|
|
62
|
+
for (const item of resolved.diagnostics) {
|
|
63
|
+
diagnostics.push(diag(item.code, item.message, file, binding.source));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function walkCompositionNodes(nodes, registry, file, diagnostics, typeReferenceEntityAggregation) {
|
|
67
|
+
for (const node of nodes) {
|
|
68
|
+
if (node.kind === "virtualContainer") {
|
|
69
|
+
if (node.generics) {
|
|
70
|
+
reportNotAllowed(node.generics, file, diagnostics);
|
|
71
|
+
}
|
|
72
|
+
walkCompositionNodes(node.children, registry, file, diagnostics, typeReferenceEntityAggregation);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (typeReferenceEntityAggregation) {
|
|
76
|
+
if (node.instance.generics) {
|
|
77
|
+
reportNotAllowed(node.instance.generics, file, diagnostics);
|
|
78
|
+
}
|
|
79
|
+
for (const agg of node.instance.aggregationCompositions ?? []) {
|
|
80
|
+
walkCompositionTemplate(agg.composition, registry, file, diagnostics, true, true);
|
|
81
|
+
}
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
validateInstanceGenerics(node.instance, registry, file, diagnostics);
|
|
85
|
+
const instanceType = registry.get(node.instance.typeFqn)?.block;
|
|
86
|
+
for (const agg of node.instance.aggregationCompositions ?? []) {
|
|
87
|
+
walkCompositionTemplate(agg.composition, registry, file, diagnostics, true, aggregationIsTypeReferenceEntity(instanceType, agg.aggregationName, registry));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function walkCompositionTemplate(template, registry, file, diagnostics, wrapperIsIllegalHost, typeReferenceEntityAggregation) {
|
|
92
|
+
if (wrapperIsIllegalHost && template.generics) {
|
|
93
|
+
reportNotAllowed(template.generics, file, diagnostics);
|
|
94
|
+
}
|
|
95
|
+
walkCompositionNodes(template.children, registry, file, diagnostics, typeReferenceEntityAggregation);
|
|
96
|
+
}
|
|
97
|
+
function walkConstraintInstance(instance, file, diagnostics) {
|
|
98
|
+
if (instance.generics) {
|
|
99
|
+
reportNotAllowed(instance.generics, file, diagnostics);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function walkMember(member, file, diagnostics) {
|
|
103
|
+
if (member.generics) {
|
|
104
|
+
reportNotAllowed(member.generics, file, diagnostics);
|
|
105
|
+
}
|
|
106
|
+
for (const instance of member.constraints ?? []) {
|
|
107
|
+
walkConstraintInstance(instance, file, diagnostics);
|
|
108
|
+
}
|
|
109
|
+
if (member.kind === "property") {
|
|
110
|
+
for (const instance of member.suggestions ?? []) {
|
|
111
|
+
walkConstraintInstance(instance, file, diagnostics);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function walkBlock(block, registry, file, diagnostics) {
|
|
116
|
+
if (block.generics) {
|
|
117
|
+
reportNotAllowed(block.generics, file, diagnostics);
|
|
118
|
+
}
|
|
119
|
+
for (const member of block.members) {
|
|
120
|
+
walkMember(member, file, diagnostics);
|
|
121
|
+
}
|
|
122
|
+
for (const template of block.compositions) {
|
|
123
|
+
walkCompositionTemplate(template, registry, file, diagnostics, true, aggregationIsTypeReferenceEntity(block, template.aggregationName, registry));
|
|
124
|
+
}
|
|
125
|
+
for (const instance of block.constraints ?? []) {
|
|
126
|
+
walkConstraintInstance(instance, file, diagnostics);
|
|
127
|
+
}
|
|
128
|
+
for (const sub of block.subBlocks) {
|
|
129
|
+
walkBlock(sub, registry, file, diagnostics);
|
|
130
|
+
}
|
|
131
|
+
for (const embedded of block.embeddedBlocks) {
|
|
132
|
+
walkBlock(embedded, registry, file, diagnostics);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export function validateGenerics(document, registry) {
|
|
136
|
+
const diagnostics = [];
|
|
137
|
+
const file = document.source.filePath ?? "<memory>";
|
|
138
|
+
walkBlock(document.block, registry, file, diagnostics);
|
|
139
|
+
return diagnostics;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=validate-generics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-generics.js","sourceRoot":"","sources":["../../src/validate/validate-generics.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,2CAA2C,CAAC;AAEnD,MAAM,qBAAqB,GAAG,0CAA0C,CAAC;AAEzE,SAAS,IAAI,CACX,IAAY,EACZ,OAAe,EACf,IAAY,EACZ,GAAoB;IAEpB,OAAO;QACL,QAAQ,EAAE,OAAO;QACjB,IAAI;QACJ,OAAO;QACP,MAAM,EAAE;YACN,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI;YACvB,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC;YACpB,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;YACxB,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,GAAG,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAwB,EACxB,IAAY,EACZ,WAAyB;IAEzB,WAAW,CAAC,IAAI,CACd,IAAI,CACF,oCAAoC,EACpC,iDAAiD,EACjD,IAAI,EACJ,OAAO,CAAC,MAAM,CACf,CACF,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAqB;IACtD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,qBAAqB,CAAC;AACrE,CAAC;AAED,SAAS,gCAAgC,CACvC,KAAkC,EAClC,eAAuB,EACvB,QAAsB;IAEtB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,IAAI,CAC1D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,CAC9D,CAAC;IACF,OAAO,MAAM,EAAE,IAAI,KAAK,aAAa,IAAI,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,wBAAwB,CAC/B,QAAuB,EACvB,QAAsB,EACtB,IAAY,EACZ,WAAyB;IAEzB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;IACjD,MAAM,YAAY,GAAG,OAAO,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAC7D,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAElC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,WAAW,CAAC,IAAI,CACd,IAAI,CACF,2BAA2B,EAC3B,eAAe,QAAQ,CAAC,OAAO,kDAAkD,EACjF,IAAI,EACJ,QAAQ,CAAC,MAAM,CAChB,CACF,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,WAAW,CAAC,IAAI,CACd,IAAI,CACF,gCAAgC,EAChC,mCAAmC,QAAQ,CAAC,OAAO,sBAAsB,EACzE,IAAI,EACJ,OAAO,CAAC,MAAM,CACf,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,WAAW,CAAC,IAAI,CACd,IAAI,CACF,gCAAgC,EAChC,0DAA0D,EAC1D,IAAI,EACJ,OAAO,CAAC,MAAM,CACf,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,yBAAyB,CACxC,MAAM,EACN,OAAO,CAAC,SAAS,EACjB,QAAQ,EACR,YAAY,CACb,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QACxC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAwB,EACxB,QAAsB,EACtB,IAAY,EACZ,WAAyB,EACzB,8BAAuC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YACrD,CAAC;YACD,oBAAoB,CAClB,IAAI,CAAC,QAAQ,EACb,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,8BAA8B,CAC/B,CAAC;YACF,SAAS;QACX,CAAC;QACD,IAAI,8BAA8B,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC3B,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAC9D,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,uBAAuB,IAAI,EAAE,EAAE,CAAC;gBAC9D,uBAAuB,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACpF,CAAC;YACD,SAAS;QACX,CAAC;QACD,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC;QAChE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,uBAAuB,IAAI,EAAE,EAAE,CAAC;YAC9D,uBAAuB,CACrB,GAAG,CAAC,WAAW,EACf,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,gCAAgC,CAAC,YAAY,EAAE,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,CAC9E,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,QAA6B,EAC7B,QAAsB,EACtB,IAAY,EACZ,WAAyB,EACzB,oBAA6B,EAC7B,8BAAuC;IAEvC,IAAI,oBAAoB,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC9C,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;IACD,oBAAoB,CAClB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,8BAA8B,CAC/B,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,QAAuB,EACvB,IAAY,EACZ,WAAyB;IAEzB,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtB,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,MAAwB,EACxB,IAAY,EACZ,WAAyB;IAEzB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;QAChD,sBAAsB,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;YAChD,sBAAsB,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAChB,KAAsB,EACtB,QAAsB,EACtB,IAAY,EACZ,WAAyB;IAEzB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QAC1C,uBAAuB,CACrB,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,gCAAgC,CAAC,KAAK,EAAE,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,CAC5E,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;QAC/C,sBAAsB,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAClC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAC9C,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QAC5C,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAqB,EACrB,QAAsB;IAEtB,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAAI,UAAU,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACvD,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-types.d.ts","sourceRoot":"","sources":["../../src/validate/validate-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,
|
|
1
|
+
{"version":3,"file":"validate-types.d.ts","sourceRoot":"","sources":["../../src/validate/validate-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EAEX,UAAU,EAGV,YAAY,EAEZ,WAAW,EACX,kBAAkB,EAGnB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AA+ajE,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,YAAY,GACrB,UAAU,EAAE,CAYd;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAEvF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAYpF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,GAAG,IAAI,YAAY,CAEhF"}
|