@kalada/core 0.1.0 → 0.2.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/README.md +25 -0
- package/dist/kalada-v1/canonicalize.cjs +266 -0
- package/dist/kalada-v1/canonicalize.cjs.map +1 -0
- package/dist/kalada-v1/canonicalize.d.cts +7 -0
- package/dist/kalada-v1/canonicalize.d.ts +7 -0
- package/dist/kalada-v1/canonicalize.js +264 -0
- package/dist/kalada-v1/canonicalize.js.map +1 -0
- package/dist/kalada-v1/codec.cjs +149 -0
- package/dist/kalada-v1/codec.cjs.map +1 -0
- package/dist/kalada-v1/codec.d.cts +27 -0
- package/dist/kalada-v1/codec.d.ts +27 -0
- package/dist/kalada-v1/codec.js +146 -0
- package/dist/kalada-v1/codec.js.map +1 -0
- package/dist/kalada-v1/compile.cjs +31 -0
- package/dist/kalada-v1/compile.cjs.map +1 -0
- package/dist/kalada-v1/compile.d.cts +7 -0
- package/dist/kalada-v1/compile.d.ts +7 -0
- package/dist/kalada-v1/compile.js +29 -0
- package/dist/kalada-v1/compile.js.map +1 -0
- package/dist/kalada-v1/dependencies.cjs +52 -0
- package/dist/kalada-v1/dependencies.cjs.map +1 -0
- package/dist/kalada-v1/dependencies.d.cts +7 -0
- package/dist/kalada-v1/dependencies.d.ts +7 -0
- package/dist/kalada-v1/dependencies.js +50 -0
- package/dist/kalada-v1/dependencies.js.map +1 -0
- package/dist/kalada-v1/diagnostics.cjs +44 -0
- package/dist/kalada-v1/diagnostics.cjs.map +1 -0
- package/dist/kalada-v1/diagnostics.d.cts +13 -0
- package/dist/kalada-v1/diagnostics.d.ts +13 -0
- package/dist/kalada-v1/diagnostics.js +40 -0
- package/dist/kalada-v1/diagnostics.js.map +1 -0
- package/dist/kalada-v1/evaluate.cjs +141 -0
- package/dist/kalada-v1/evaluate.cjs.map +1 -0
- package/dist/kalada-v1/evaluate.d.cts +7 -0
- package/dist/kalada-v1/evaluate.d.ts +7 -0
- package/dist/kalada-v1/evaluate.js +139 -0
- package/dist/kalada-v1/evaluate.js.map +1 -0
- package/dist/kalada-v1/factories.cjs +48 -0
- package/dist/kalada-v1/factories.cjs.map +1 -0
- package/dist/kalada-v1/factories.d.cts +22 -0
- package/dist/kalada-v1/factories.d.ts +22 -0
- package/dist/kalada-v1/factories.js +46 -0
- package/dist/kalada-v1/factories.js.map +1 -0
- package/dist/kalada-v1/index.cjs +71 -0
- package/dist/kalada-v1/index.cjs.map +1 -0
- package/dist/kalada-v1/index.d.cts +10 -0
- package/dist/kalada-v1/index.d.ts +10 -0
- package/dist/kalada-v1/index.js +10 -0
- package/dist/kalada-v1/index.js.map +1 -0
- package/dist/kalada-v1/json.cjs +129 -0
- package/dist/kalada-v1/json.cjs.map +1 -0
- package/dist/kalada-v1/json.d.cts +20 -0
- package/dist/kalada-v1/json.d.ts +20 -0
- package/dist/kalada-v1/json.js +123 -0
- package/dist/kalada-v1/json.js.map +1 -0
- package/dist/kalada-v1/limits.cjs +34 -0
- package/dist/kalada-v1/limits.cjs.map +1 -0
- package/dist/kalada-v1/limits.d.cts +8 -0
- package/dist/kalada-v1/limits.d.ts +8 -0
- package/dist/kalada-v1/limits.js +31 -0
- package/dist/kalada-v1/limits.js.map +1 -0
- package/dist/kalada-v1/schemas.cjs +154 -0
- package/dist/kalada-v1/schemas.cjs.map +1 -0
- package/dist/kalada-v1/schemas.d.cts +5 -0
- package/dist/kalada-v1/schemas.d.ts +5 -0
- package/dist/kalada-v1/schemas.js +151 -0
- package/dist/kalada-v1/schemas.js.map +1 -0
- package/dist/kalada-v1/types.cjs +4 -0
- package/dist/kalada-v1/types.cjs.map +1 -0
- package/dist/kalada-v1/types.d.cts +91 -0
- package/dist/kalada-v1/types.d.ts +91 -0
- package/dist/kalada-v1/types.js +3 -0
- package/dist/kalada-v1/types.js.map +1 -0
- package/dist/kalada-v1/values.cjs +100 -0
- package/dist/kalada-v1/values.cjs.map +1 -0
- package/dist/kalada-v1/values.d.cts +48 -0
- package/dist/kalada-v1/values.d.ts +48 -0
- package/dist/kalada-v1/values.js +93 -0
- package/dist/kalada-v1/values.js.map +1 -0
- package/package.json +11 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { JsonValue } from './json.js';
|
|
2
|
+
import { KaladaV1Expression } from './types.js';
|
|
3
|
+
import './values.js';
|
|
4
|
+
|
|
5
|
+
declare function collectKaladaV1Dependencies<R extends JsonValue>(expression: KaladaV1Expression<R>): readonly R[];
|
|
6
|
+
|
|
7
|
+
export { collectKaladaV1Dependencies };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { canonicalJsonIdentity } from './json.js';
|
|
2
|
+
|
|
3
|
+
function collectKaladaV1Dependencies(expression) {
|
|
4
|
+
const output = [];
|
|
5
|
+
const identities = /* @__PURE__ */ new Set();
|
|
6
|
+
visit(expression, /* @__PURE__ */ new Set(), output, identities);
|
|
7
|
+
return Object.freeze(output);
|
|
8
|
+
}
|
|
9
|
+
function visit(node, scope, output, identities) {
|
|
10
|
+
if (node.kind === "ref") {
|
|
11
|
+
addReference(node.ref, scope, output, identities);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (node.kind === "literal" || node.kind === "option" && node.variant === "none") return;
|
|
15
|
+
if (node.kind === "binding") {
|
|
16
|
+
visitBinding(node, scope, output, identities);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (node.kind === "match") {
|
|
20
|
+
visitMatch(node.value, node.arms, scope, output, identities);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
visit(node.value, scope, output, identities);
|
|
24
|
+
}
|
|
25
|
+
function visitBinding(node, scope, output, identities) {
|
|
26
|
+
visit(node.value, scope, output, identities);
|
|
27
|
+
visit(node.body, extended(scope, node.name), output, identities);
|
|
28
|
+
}
|
|
29
|
+
function visitMatch(value, arms, scope, output, identities) {
|
|
30
|
+
visit(value, scope, output, identities);
|
|
31
|
+
for (const arm of arms) {
|
|
32
|
+
visit(arm.body, arm.binding ? extended(scope, arm.binding) : scope, output, identities);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function addReference(reference, scope, output, identities) {
|
|
36
|
+
if (typeof reference === "string" && scope.has(reference)) return;
|
|
37
|
+
const identity = canonicalJsonIdentity(reference);
|
|
38
|
+
if (identities.has(identity)) return;
|
|
39
|
+
identities.add(identity);
|
|
40
|
+
output.push(reference);
|
|
41
|
+
}
|
|
42
|
+
function extended(scope, name) {
|
|
43
|
+
const output = new Set(scope);
|
|
44
|
+
output.add(name);
|
|
45
|
+
return output;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export { collectKaladaV1Dependencies };
|
|
49
|
+
//# sourceMappingURL=dependencies.js.map
|
|
50
|
+
//# sourceMappingURL=dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/dependencies.ts"],"names":[],"mappings":";;AAGO,SAAS,4BACd,UAAA,EACc;AACd,EAAA,MAAM,SAAc,EAAC;AACrB,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,CAAM,UAAA,kBAAY,IAAI,GAAA,EAAI,EAAG,QAAQ,UAAU,CAAA;AAC/C,EAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B;AAEA,SAAS,KAAA,CACP,IAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,IAAA,YAAA,CAAa,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAChD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,IAAc,IAAA,CAAK,SAAS,QAAA,IAAY,IAAA,CAAK,YAAY,MAAA,EAAS;AACpF,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,IAAA,YAAA,CAAa,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC5C,IAAA;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,UAAA,CAAW,KAAK,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,QAAQ,UAAU,CAAA;AAC3D,IAAA;AAAA,EACF;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC7C;AAEA,SAAS,YAAA,CACP,IAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC3C,EAAA,KAAA,CAAM,IAAA,CAAK,MAAM,QAAA,CAAS,KAAA,EAAO,KAAK,IAAI,CAAA,EAAG,QAAQ,UAAU,CAAA;AACjE;AAEA,SAAS,UAAA,CACP,KAAA,EACA,IAAA,EACA,KAAA,EACA,QACA,UAAA,EACM;AACN,EAAA,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AACtC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,CAAM,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAA,GAAU,QAAA,CAAS,KAAA,EAAO,GAAA,CAAI,OAAO,CAAA,GAAI,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAAA,EACxF;AACF;AAEA,SAAS,YAAA,CACP,SAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3D,EAAA,MAAM,QAAA,GAAW,sBAAsB,SAAS,CAAA;AAChD,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,EAAA,UAAA,CAAW,IAAI,QAAQ,CAAA;AACvB,EAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACvB;AAEA,SAAS,QAAA,CAAS,OAA4B,IAAA,EAAmC;AAC/E,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,KAAK,CAAA;AAC5B,EAAA,MAAA,CAAO,IAAI,IAAI,CAAA;AACf,EAAA,OAAO,MAAA;AACT","file":"dependencies.js","sourcesContent":["import { canonicalJsonIdentity, type JsonValue } from \"./json.js\";\nimport type { KaladaV1Expression, MatchArm } from \"./types.js\";\n\nexport function collectKaladaV1Dependencies<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n): readonly R[] {\n const output: R[] = [];\n const identities = new Set<string>();\n visit(expression, new Set(), output, identities);\n return Object.freeze(output);\n}\n\nfunction visit<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (node.kind === \"ref\") {\n addReference(node.ref, scope, output, identities);\n return;\n }\n if (node.kind === \"literal\" || (node.kind === \"option\" && node.variant === \"none\")) return;\n if (node.kind === \"binding\") {\n visitBinding(node, scope, output, identities);\n return;\n }\n if (node.kind === \"match\") {\n visitMatch(node.value, node.arms, scope, output, identities);\n return;\n }\n visit(node.value, scope, output, identities);\n}\n\nfunction visitBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(node.value, scope, output, identities);\n visit(node.body, extended(scope, node.name), output, identities);\n}\n\nfunction visitMatch<R extends JsonValue>(\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(value, scope, output, identities);\n for (const arm of arms) {\n visit(arm.body, arm.binding ? extended(scope, arm.binding) : scope, output, identities);\n }\n}\n\nfunction addReference<R extends JsonValue>(\n reference: R,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (typeof reference === \"string\" && scope.has(reference)) return;\n const identity = canonicalJsonIdentity(reference);\n if (identities.has(identity)) return;\n identities.add(identity);\n output.push(reference);\n}\n\nfunction extended(scope: ReadonlySet<string>, name: string): ReadonlySet<string> {\n const output = new Set(scope);\n output.add(name);\n return output;\n}\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const MESSAGES = Object.freeze({
|
|
4
|
+
KALADA_INVALID_INPUT: "Kalada program input is invalid.",
|
|
5
|
+
KALADA_LIMIT_EXCEEDED: "Kalada program input exceeds a configured limit.",
|
|
6
|
+
KALADA_INVALID_REFERENCE: "Kalada reference is invalid.",
|
|
7
|
+
KALADA_MATCH_MISSING_ARM: "Kalada match is missing a required arm.",
|
|
8
|
+
KALADA_MATCH_DUPLICATE_ARM: "Kalada match contains a duplicate arm.",
|
|
9
|
+
KALADA_MATCH_UNKNOWN_ARM: "Kalada match contains an unknown arm.",
|
|
10
|
+
KALADA_MATCH_UNREACHABLE_ARM: "Kalada match contains an unreachable arm.",
|
|
11
|
+
KALADA_MATCH_TYPE_MISMATCH: "Kalada match received the wrong value type.",
|
|
12
|
+
KALADA_REFERENCE_ERROR: "Kalada reference resolution failed.",
|
|
13
|
+
KALADA_REFERENCE_MISSING: "Kalada reference is missing.",
|
|
14
|
+
KALADA_REFERENCE_DENIED: "Kalada reference access was denied.",
|
|
15
|
+
KALADA_ASYNC_UNSUPPORTED: "Kalada callbacks must return synchronously.",
|
|
16
|
+
KALADA_INVALID_RESULT: "Kalada reference callback returned an invalid value.",
|
|
17
|
+
KALADA_EVALUATION_LIMIT: "Kalada evaluation exceeded its configured step limit."
|
|
18
|
+
});
|
|
19
|
+
class KaladaFailure extends Error {
|
|
20
|
+
code;
|
|
21
|
+
path;
|
|
22
|
+
constructor(code, path) {
|
|
23
|
+
super(code);
|
|
24
|
+
this.code = code;
|
|
25
|
+
this.path = path;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function failure(code, path) {
|
|
29
|
+
const diagnostic = Object.freeze({
|
|
30
|
+
code,
|
|
31
|
+
path: Object.freeze([...path]),
|
|
32
|
+
message: MESSAGES[code]
|
|
33
|
+
});
|
|
34
|
+
return Object.freeze({ ok: false, diagnostic });
|
|
35
|
+
}
|
|
36
|
+
function success(value) {
|
|
37
|
+
return Object.freeze({ ok: true, value });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
exports.KaladaFailure = KaladaFailure;
|
|
41
|
+
exports.failure = failure;
|
|
42
|
+
exports.success = success;
|
|
43
|
+
//# sourceMappingURL=diagnostics.cjs.map
|
|
44
|
+
//# sourceMappingURL=diagnostics.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/diagnostics.ts"],"names":[],"mappings":";;AAEA,MAAM,QAAA,GAA6D,OAAO,MAAA,CAAO;AAAA,EAC/E,oBAAA,EAAsB,kCAAA;AAAA,EACtB,qBAAA,EAAuB,kDAAA;AAAA,EACvB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,wBAAA,EAA0B,yCAAA;AAAA,EAC1B,0BAAA,EAA4B,wCAAA;AAAA,EAC5B,wBAAA,EAA0B,uCAAA;AAAA,EAC1B,4BAAA,EAA8B,2CAAA;AAAA,EAC9B,0BAAA,EAA4B,6CAAA;AAAA,EAC5B,sBAAA,EAAwB,qCAAA;AAAA,EACxB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,uBAAA,EAAyB,qCAAA;AAAA,EACzB,wBAAA,EAA0B,6CAAA;AAAA,EAC1B,qBAAA,EAAuB,sDAAA;AAAA,EACvB,uBAAA,EAAyB;AAC3B,CAAC,CAAA;AAEM,MAAM,sBAAsB,KAAA,CAAM;AAAA,EAC9B,IAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,MAA8B,IAAA,EAAoC;AAC5E,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAEO,SAAS,OAAA,CACd,MACA,IAAA,EACoB;AACpB,EAAA,MAAM,UAAA,GAAiC,OAAO,MAAA,CAAO;AAAA,IACnD,IAAA;AAAA,IACA,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,IAAI,CAAC,CAAA;AAAA,IAC7B,OAAA,EAAS,SAAS,IAAI;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,KAAA,EAAO,YAAY,CAAA;AAChD;AAEO,SAAS,QAAW,KAAA,EAA8B;AACvD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AAC1C","file":"diagnostics.cjs","sourcesContent":["import type { KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1Outcome } from \"./types.js\";\n\nconst MESSAGES: Readonly<Record<KaladaV1DiagnosticCode, string>> = Object.freeze({\n KALADA_INVALID_INPUT: \"Kalada program input is invalid.\",\n KALADA_LIMIT_EXCEEDED: \"Kalada program input exceeds a configured limit.\",\n KALADA_INVALID_REFERENCE: \"Kalada reference is invalid.\",\n KALADA_MATCH_MISSING_ARM: \"Kalada match is missing a required arm.\",\n KALADA_MATCH_DUPLICATE_ARM: \"Kalada match contains a duplicate arm.\",\n KALADA_MATCH_UNKNOWN_ARM: \"Kalada match contains an unknown arm.\",\n KALADA_MATCH_UNREACHABLE_ARM: \"Kalada match contains an unreachable arm.\",\n KALADA_MATCH_TYPE_MISMATCH: \"Kalada match received the wrong value type.\",\n KALADA_REFERENCE_ERROR: \"Kalada reference resolution failed.\",\n KALADA_REFERENCE_MISSING: \"Kalada reference is missing.\",\n KALADA_REFERENCE_DENIED: \"Kalada reference access was denied.\",\n KALADA_ASYNC_UNSUPPORTED: \"Kalada callbacks must return synchronously.\",\n KALADA_INVALID_RESULT: \"Kalada reference callback returned an invalid value.\",\n KALADA_EVALUATION_LIMIT: \"Kalada evaluation exceeded its configured step limit.\",\n});\n\nexport class KaladaFailure extends Error {\n readonly code: KaladaV1DiagnosticCode;\n readonly path: readonly (string | number)[];\n\n constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]) {\n super(code);\n this.code = code;\n this.path = path;\n }\n}\n\nexport function failure<T>(\n code: KaladaV1DiagnosticCode,\n path: readonly (string | number)[],\n): KaladaV1Outcome<T> {\n const diagnostic: KaladaV1Diagnostic = Object.freeze({\n code,\n path: Object.freeze([...path]),\n message: MESSAGES[code],\n });\n return Object.freeze({ ok: false, diagnostic });\n}\n\nexport function success<T>(value: T): KaladaV1Outcome<T> {\n return Object.freeze({ ok: true, value });\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { KaladaV1DiagnosticCode, KaladaV1Outcome } from './types.cjs';
|
|
2
|
+
import './json.cjs';
|
|
3
|
+
import './values.cjs';
|
|
4
|
+
|
|
5
|
+
declare class KaladaFailure extends Error {
|
|
6
|
+
readonly code: KaladaV1DiagnosticCode;
|
|
7
|
+
readonly path: readonly (string | number)[];
|
|
8
|
+
constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]);
|
|
9
|
+
}
|
|
10
|
+
declare function failure<T>(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]): KaladaV1Outcome<T>;
|
|
11
|
+
declare function success<T>(value: T): KaladaV1Outcome<T>;
|
|
12
|
+
|
|
13
|
+
export { KaladaFailure, failure, success };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { KaladaV1DiagnosticCode, KaladaV1Outcome } from './types.js';
|
|
2
|
+
import './json.js';
|
|
3
|
+
import './values.js';
|
|
4
|
+
|
|
5
|
+
declare class KaladaFailure extends Error {
|
|
6
|
+
readonly code: KaladaV1DiagnosticCode;
|
|
7
|
+
readonly path: readonly (string | number)[];
|
|
8
|
+
constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]);
|
|
9
|
+
}
|
|
10
|
+
declare function failure<T>(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]): KaladaV1Outcome<T>;
|
|
11
|
+
declare function success<T>(value: T): KaladaV1Outcome<T>;
|
|
12
|
+
|
|
13
|
+
export { KaladaFailure, failure, success };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const MESSAGES = Object.freeze({
|
|
2
|
+
KALADA_INVALID_INPUT: "Kalada program input is invalid.",
|
|
3
|
+
KALADA_LIMIT_EXCEEDED: "Kalada program input exceeds a configured limit.",
|
|
4
|
+
KALADA_INVALID_REFERENCE: "Kalada reference is invalid.",
|
|
5
|
+
KALADA_MATCH_MISSING_ARM: "Kalada match is missing a required arm.",
|
|
6
|
+
KALADA_MATCH_DUPLICATE_ARM: "Kalada match contains a duplicate arm.",
|
|
7
|
+
KALADA_MATCH_UNKNOWN_ARM: "Kalada match contains an unknown arm.",
|
|
8
|
+
KALADA_MATCH_UNREACHABLE_ARM: "Kalada match contains an unreachable arm.",
|
|
9
|
+
KALADA_MATCH_TYPE_MISMATCH: "Kalada match received the wrong value type.",
|
|
10
|
+
KALADA_REFERENCE_ERROR: "Kalada reference resolution failed.",
|
|
11
|
+
KALADA_REFERENCE_MISSING: "Kalada reference is missing.",
|
|
12
|
+
KALADA_REFERENCE_DENIED: "Kalada reference access was denied.",
|
|
13
|
+
KALADA_ASYNC_UNSUPPORTED: "Kalada callbacks must return synchronously.",
|
|
14
|
+
KALADA_INVALID_RESULT: "Kalada reference callback returned an invalid value.",
|
|
15
|
+
KALADA_EVALUATION_LIMIT: "Kalada evaluation exceeded its configured step limit."
|
|
16
|
+
});
|
|
17
|
+
class KaladaFailure extends Error {
|
|
18
|
+
code;
|
|
19
|
+
path;
|
|
20
|
+
constructor(code, path) {
|
|
21
|
+
super(code);
|
|
22
|
+
this.code = code;
|
|
23
|
+
this.path = path;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function failure(code, path) {
|
|
27
|
+
const diagnostic = Object.freeze({
|
|
28
|
+
code,
|
|
29
|
+
path: Object.freeze([...path]),
|
|
30
|
+
message: MESSAGES[code]
|
|
31
|
+
});
|
|
32
|
+
return Object.freeze({ ok: false, diagnostic });
|
|
33
|
+
}
|
|
34
|
+
function success(value) {
|
|
35
|
+
return Object.freeze({ ok: true, value });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { KaladaFailure, failure, success };
|
|
39
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
40
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/diagnostics.ts"],"names":[],"mappings":"AAEA,MAAM,QAAA,GAA6D,OAAO,MAAA,CAAO;AAAA,EAC/E,oBAAA,EAAsB,kCAAA;AAAA,EACtB,qBAAA,EAAuB,kDAAA;AAAA,EACvB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,wBAAA,EAA0B,yCAAA;AAAA,EAC1B,0BAAA,EAA4B,wCAAA;AAAA,EAC5B,wBAAA,EAA0B,uCAAA;AAAA,EAC1B,4BAAA,EAA8B,2CAAA;AAAA,EAC9B,0BAAA,EAA4B,6CAAA;AAAA,EAC5B,sBAAA,EAAwB,qCAAA;AAAA,EACxB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,uBAAA,EAAyB,qCAAA;AAAA,EACzB,wBAAA,EAA0B,6CAAA;AAAA,EAC1B,qBAAA,EAAuB,sDAAA;AAAA,EACvB,uBAAA,EAAyB;AAC3B,CAAC,CAAA;AAEM,MAAM,sBAAsB,KAAA,CAAM;AAAA,EAC9B,IAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,MAA8B,IAAA,EAAoC;AAC5E,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAEO,SAAS,OAAA,CACd,MACA,IAAA,EACoB;AACpB,EAAA,MAAM,UAAA,GAAiC,OAAO,MAAA,CAAO;AAAA,IACnD,IAAA;AAAA,IACA,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,IAAI,CAAC,CAAA;AAAA,IAC7B,OAAA,EAAS,SAAS,IAAI;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,KAAA,EAAO,YAAY,CAAA;AAChD;AAEO,SAAS,QAAW,KAAA,EAA8B;AACvD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AAC1C","file":"diagnostics.js","sourcesContent":["import type { KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1Outcome } from \"./types.js\";\n\nconst MESSAGES: Readonly<Record<KaladaV1DiagnosticCode, string>> = Object.freeze({\n KALADA_INVALID_INPUT: \"Kalada program input is invalid.\",\n KALADA_LIMIT_EXCEEDED: \"Kalada program input exceeds a configured limit.\",\n KALADA_INVALID_REFERENCE: \"Kalada reference is invalid.\",\n KALADA_MATCH_MISSING_ARM: \"Kalada match is missing a required arm.\",\n KALADA_MATCH_DUPLICATE_ARM: \"Kalada match contains a duplicate arm.\",\n KALADA_MATCH_UNKNOWN_ARM: \"Kalada match contains an unknown arm.\",\n KALADA_MATCH_UNREACHABLE_ARM: \"Kalada match contains an unreachable arm.\",\n KALADA_MATCH_TYPE_MISMATCH: \"Kalada match received the wrong value type.\",\n KALADA_REFERENCE_ERROR: \"Kalada reference resolution failed.\",\n KALADA_REFERENCE_MISSING: \"Kalada reference is missing.\",\n KALADA_REFERENCE_DENIED: \"Kalada reference access was denied.\",\n KALADA_ASYNC_UNSUPPORTED: \"Kalada callbacks must return synchronously.\",\n KALADA_INVALID_RESULT: \"Kalada reference callback returned an invalid value.\",\n KALADA_EVALUATION_LIMIT: \"Kalada evaluation exceeded its configured step limit.\",\n});\n\nexport class KaladaFailure extends Error {\n readonly code: KaladaV1DiagnosticCode;\n readonly path: readonly (string | number)[];\n\n constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]) {\n super(code);\n this.code = code;\n this.path = path;\n }\n}\n\nexport function failure<T>(\n code: KaladaV1DiagnosticCode,\n path: readonly (string | number)[],\n): KaladaV1Outcome<T> {\n const diagnostic: KaladaV1Diagnostic = Object.freeze({\n code,\n path: Object.freeze([...path]),\n message: MESSAGES[code],\n });\n return Object.freeze({ ok: false, diagnostic });\n}\n\nexport function success<T>(value: T): KaladaV1Outcome<T> {\n return Object.freeze({ ok: true, value });\n}\n"]}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var callbackPromise_js = require('../kuery-v1/callback-promise.js');
|
|
4
|
+
var diagnostics_js = require('./diagnostics.js');
|
|
5
|
+
var json_js = require('./json.js');
|
|
6
|
+
var values_js = require('./values.js');
|
|
7
|
+
|
|
8
|
+
function evaluateKaladaV1(expression, resolve, limits) {
|
|
9
|
+
try {
|
|
10
|
+
return diagnostics_js.success(
|
|
11
|
+
evaluateNode(expression, ["expression"], /* @__PURE__ */ new Map(), { resolve, limits, steps: 0 })
|
|
12
|
+
);
|
|
13
|
+
} catch (error) {
|
|
14
|
+
const problem = error instanceof diagnostics_js.KaladaFailure ? error : new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", []);
|
|
15
|
+
return diagnostics_js.failure(problem.code, problem.path);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function evaluateNode(node, path, scope, state) {
|
|
19
|
+
charge(path, state);
|
|
20
|
+
if (node.kind === "literal") return node.value;
|
|
21
|
+
if (node.kind === "ref") return evaluateReference(node.ref, path, scope, state);
|
|
22
|
+
if (node.kind === "binding") return evaluateBinding(node, path, scope, state);
|
|
23
|
+
if (node.kind === "option") {
|
|
24
|
+
return node.variant === "none" ? values_js.Option.none() : values_js.Option.some(evaluateNode(node.value, [...path, "value"], scope, state));
|
|
25
|
+
}
|
|
26
|
+
if (node.kind === "result") {
|
|
27
|
+
const value = evaluateNode(node.value, [...path, "value"], scope, state);
|
|
28
|
+
return node.variant === "ok" ? values_js.Result.ok(value) : values_js.Result.err(value);
|
|
29
|
+
}
|
|
30
|
+
return evaluateMatch(node, path, scope, state);
|
|
31
|
+
}
|
|
32
|
+
function evaluateBinding(node, path, scope, state) {
|
|
33
|
+
const value = evaluateNode(node.value, [...path, "value"], scope, state);
|
|
34
|
+
const nested = new Map(scope);
|
|
35
|
+
nested.set(node.name, value);
|
|
36
|
+
return evaluateNode(node.body, [...path, "body"], nested, state);
|
|
37
|
+
}
|
|
38
|
+
function evaluateMatch(node, path, scope, state) {
|
|
39
|
+
const valuePath = [...path, "value"];
|
|
40
|
+
const value = evaluateNode(node.value, valuePath, scope, state);
|
|
41
|
+
if (node.type === "Option" && !values_js.isOption(value)) {
|
|
42
|
+
throw new diagnostics_js.KaladaFailure("KALADA_MATCH_TYPE_MISMATCH", valuePath);
|
|
43
|
+
}
|
|
44
|
+
if (node.type === "Result" && !values_js.isResult(value)) {
|
|
45
|
+
throw new diagnostics_js.KaladaFailure("KALADA_MATCH_TYPE_MISMATCH", valuePath);
|
|
46
|
+
}
|
|
47
|
+
if (!values_js.isOption(value) && !values_js.isResult(value)) {
|
|
48
|
+
throw new diagnostics_js.KaladaFailure("KALADA_MATCH_TYPE_MISMATCH", valuePath);
|
|
49
|
+
}
|
|
50
|
+
const variant = value.variant;
|
|
51
|
+
const armIndex = node.arms.findIndex((candidate) => candidate.variant === variant);
|
|
52
|
+
const arm = node.arms[armIndex];
|
|
53
|
+
if (!arm) throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", [...path, "arms"]);
|
|
54
|
+
const nested = bindPayload(scope, arm, value);
|
|
55
|
+
return evaluateNode(arm.body, [...path, "arms", armIndex, "body"], nested, state);
|
|
56
|
+
}
|
|
57
|
+
function bindPayload(scope, arm, value) {
|
|
58
|
+
if (!arm.binding || !values_js.isOption(value) && !values_js.isResult(value) || value.variant === "none")
|
|
59
|
+
return scope;
|
|
60
|
+
const nested = new Map(scope);
|
|
61
|
+
nested.set(arm.binding, value.value);
|
|
62
|
+
return nested;
|
|
63
|
+
}
|
|
64
|
+
function evaluateReference(reference, path, scope, state) {
|
|
65
|
+
if (typeof reference === "string" && scope.has(reference))
|
|
66
|
+
return scope.get(reference);
|
|
67
|
+
let input;
|
|
68
|
+
try {
|
|
69
|
+
input = state.resolve(reference);
|
|
70
|
+
} catch {
|
|
71
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
72
|
+
}
|
|
73
|
+
if (callbackPromise_js.rejectCallbackPromise(input)) throw new diagnostics_js.KaladaFailure("KALADA_ASYNC_UNSUPPORTED", path);
|
|
74
|
+
return parseResolution(input, path, state.limits);
|
|
75
|
+
}
|
|
76
|
+
function parseResolution(input, path, limits) {
|
|
77
|
+
if (typeof input !== "object" || input === null || Array.isArray(input)) {
|
|
78
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
79
|
+
}
|
|
80
|
+
const keys = safeKeys(input, path);
|
|
81
|
+
const found = safeData(input, "found", path);
|
|
82
|
+
if (typeof found !== "boolean") throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
83
|
+
if (!found) return missingResolution(input, keys, path);
|
|
84
|
+
if (keys.length !== 2 || !keys.includes("value"))
|
|
85
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
86
|
+
return safeValue(safeData(input, "value", path), path, limits);
|
|
87
|
+
}
|
|
88
|
+
function missingResolution(input, keys, path) {
|
|
89
|
+
if (keys.length === 1) throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_MISSING", path);
|
|
90
|
+
if (keys.length !== 2 || !keys.includes("reason"))
|
|
91
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
92
|
+
const reason = safeData(input, "reason", path);
|
|
93
|
+
if (reason === void 0 || reason === "missing")
|
|
94
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_MISSING", path);
|
|
95
|
+
if (reason === "denied") throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_DENIED", path);
|
|
96
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
97
|
+
}
|
|
98
|
+
function safeValue(input, path, limits) {
|
|
99
|
+
try {
|
|
100
|
+
if (values_js.isOption(input) || values_js.isResult(input)) {
|
|
101
|
+
values_js.validateKaladaValueLimits(input, {
|
|
102
|
+
maxDepth: limits.maxValueDepth,
|
|
103
|
+
maxNodes: limits.maxValueNodes,
|
|
104
|
+
maxStringLength: limits.maxStringLength
|
|
105
|
+
});
|
|
106
|
+
return input;
|
|
107
|
+
}
|
|
108
|
+
return json_js.cloneJson(input, {
|
|
109
|
+
maxDepth: limits.maxValueDepth,
|
|
110
|
+
maxNodes: limits.maxValueNodes,
|
|
111
|
+
maxStringLength: limits.maxStringLength
|
|
112
|
+
});
|
|
113
|
+
} catch (error) {
|
|
114
|
+
if (error instanceof RangeError) throw new diagnostics_js.KaladaFailure("KALADA_LIMIT_EXCEEDED", path);
|
|
115
|
+
throw new diagnostics_js.KaladaFailure("KALADA_INVALID_RESULT", path);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function safeKeys(input, path) {
|
|
119
|
+
try {
|
|
120
|
+
return Reflect.ownKeys(input);
|
|
121
|
+
} catch {
|
|
122
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function safeData(input, key, path) {
|
|
126
|
+
try {
|
|
127
|
+
return json_js.dataValue(input, key);
|
|
128
|
+
} catch {
|
|
129
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function charge(path, state) {
|
|
133
|
+
state.steps += 1;
|
|
134
|
+
if (state.steps > state.limits.maxEvaluationSteps) {
|
|
135
|
+
throw new diagnostics_js.KaladaFailure("KALADA_EVALUATION_LIMIT", path);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
exports.evaluateKaladaV1 = evaluateKaladaV1;
|
|
140
|
+
//# sourceMappingURL=evaluate.cjs.map
|
|
141
|
+
//# sourceMappingURL=evaluate.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/evaluate.ts"],"names":["success","KaladaFailure","failure","Option","Result","isOption","isResult","rejectCallbackPromise","validateKaladaValueLimits","cloneJson","dataValue"],"mappings":"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","file":"evaluate.cjs","sourcesContent":["import { rejectCallbackPromise } from \"../kuery-v1/callback-promise.js\";\nimport { failure, KaladaFailure, success } from \"./diagnostics.js\";\nimport { cloneJson, dataValue, type JsonValue } from \"./json.js\";\nimport type {\n KaladaV1Expression,\n KaladaV1Limits,\n KaladaV1Outcome,\n KaladaV1Resolver,\n MatchArm,\n} from \"./types.js\";\nimport {\n isOption,\n isResult,\n type KaladaValue,\n Option,\n Result,\n validateKaladaValueLimits,\n} from \"./values.js\";\n\ntype Path = readonly (string | number)[];\ninterface State<R extends JsonValue> {\n readonly resolve: KaladaV1Resolver<R>;\n readonly limits: KaladaV1Limits;\n steps: number;\n}\n\nexport function evaluateKaladaV1<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n resolve: KaladaV1Resolver<R>,\n limits: KaladaV1Limits,\n): KaladaV1Outcome<KaladaValue> {\n try {\n return success(\n evaluateNode(expression, [\"expression\"], new Map(), { resolve, limits, steps: 0 }),\n );\n } catch (error) {\n const problem =\n error instanceof KaladaFailure ? error : new KaladaFailure(\"KALADA_REFERENCE_ERROR\", []);\n return failure(problem.code, problem.path);\n }\n}\n\nfunction evaluateNode<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n charge(path, state);\n if (node.kind === \"literal\") return node.value;\n if (node.kind === \"ref\") return evaluateReference(node.ref, path, scope, state);\n if (node.kind === \"binding\") return evaluateBinding(node, path, scope, state);\n if (node.kind === \"option\") {\n return node.variant === \"none\"\n ? Option.none()\n : Option.some(evaluateNode(node.value, [...path, \"value\"], scope, state));\n }\n if (node.kind === \"result\") {\n const value = evaluateNode(node.value, [...path, \"value\"], scope, state);\n return node.variant === \"ok\" ? Result.ok(value) : Result.err(value);\n }\n return evaluateMatch(node, path, scope, state);\n}\n\nfunction evaluateBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n const value = evaluateNode(node.value, [...path, \"value\"], scope, state);\n const nested = new Map(scope);\n nested.set(node.name, value);\n return evaluateNode(node.body, [...path, \"body\"], nested, state);\n}\n\nfunction evaluateMatch<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"match\" }>,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n const valuePath = [...path, \"value\"];\n const value = evaluateNode(node.value, valuePath, scope, state);\n if (node.type === \"Option\" && !isOption(value)) {\n throw new KaladaFailure(\"KALADA_MATCH_TYPE_MISMATCH\", valuePath);\n }\n if (node.type === \"Result\" && !isResult(value)) {\n throw new KaladaFailure(\"KALADA_MATCH_TYPE_MISMATCH\", valuePath);\n }\n if (!isOption(value) && !isResult(value)) {\n throw new KaladaFailure(\"KALADA_MATCH_TYPE_MISMATCH\", valuePath);\n }\n const variant = value.variant;\n const armIndex = node.arms.findIndex((candidate) => candidate.variant === variant);\n const arm = node.arms[armIndex];\n if (!arm) throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"arms\"]);\n const nested = bindPayload(scope, arm, value);\n return evaluateNode(arm.body, [...path, \"arms\", armIndex, \"body\"], nested, state);\n}\n\nfunction bindPayload(\n scope: ReadonlyMap<string, KaladaValue>,\n arm: MatchArm<JsonValue>,\n value: KaladaValue,\n): ReadonlyMap<string, KaladaValue> {\n if (!arm.binding || (!isOption(value) && !isResult(value)) || value.variant === \"none\")\n return scope;\n const nested = new Map(scope);\n nested.set(arm.binding, value.value);\n return nested;\n}\n\nfunction evaluateReference<R extends JsonValue>(\n reference: R,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n if (typeof reference === \"string\" && scope.has(reference))\n return scope.get(reference) as KaladaValue;\n let input: unknown;\n try {\n input = state.resolve(reference);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n if (rejectCallbackPromise(input)) throw new KaladaFailure(\"KALADA_ASYNC_UNSUPPORTED\", path);\n return parseResolution(input, path, state.limits);\n}\n\nfunction parseResolution(input: unknown, path: Path, limits: KaladaV1Limits): KaladaValue {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n const keys = safeKeys(input, path);\n const found = safeData(input, \"found\", path);\n if (typeof found !== \"boolean\") throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n if (!found) return missingResolution(input, keys, path);\n if (keys.length !== 2 || !keys.includes(\"value\"))\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n return safeValue(safeData(input, \"value\", path), path, limits);\n}\n\nfunction missingResolution(input: object, keys: readonly PropertyKey[], path: Path): never {\n if (keys.length === 1) throw new KaladaFailure(\"KALADA_REFERENCE_MISSING\", path);\n if (keys.length !== 2 || !keys.includes(\"reason\"))\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n const reason = safeData(input, \"reason\", path);\n if (reason === undefined || reason === \"missing\")\n throw new KaladaFailure(\"KALADA_REFERENCE_MISSING\", path);\n if (reason === \"denied\") throw new KaladaFailure(\"KALADA_REFERENCE_DENIED\", path);\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n}\n\nfunction safeValue(input: unknown, path: Path, limits: KaladaV1Limits): KaladaValue {\n try {\n if (isOption(input) || isResult(input)) {\n validateKaladaValueLimits(input, {\n maxDepth: limits.maxValueDepth,\n maxNodes: limits.maxValueNodes,\n maxStringLength: limits.maxStringLength,\n });\n return input;\n }\n return cloneJson(input, {\n maxDepth: limits.maxValueDepth,\n maxNodes: limits.maxValueNodes,\n maxStringLength: limits.maxStringLength,\n });\n } catch (error) {\n if (error instanceof RangeError) throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n throw new KaladaFailure(\"KALADA_INVALID_RESULT\", path);\n }\n}\n\nfunction safeKeys(input: object, path: Path): PropertyKey[] {\n try {\n return Reflect.ownKeys(input);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n}\n\nfunction safeData(input: object, key: string, path: Path): unknown {\n try {\n return dataValue(input, key);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n}\n\nfunction charge<R extends JsonValue>(path: Path, state: State<R>): void {\n state.steps += 1;\n if (state.steps > state.limits.maxEvaluationSteps) {\n throw new KaladaFailure(\"KALADA_EVALUATION_LIMIT\", path);\n }\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { JsonValue } from './json.cjs';
|
|
2
|
+
import { KaladaV1Expression, KaladaV1Resolver, KaladaV1Limits, KaladaV1Outcome } from './types.cjs';
|
|
3
|
+
import { KaladaValue } from './values.cjs';
|
|
4
|
+
|
|
5
|
+
declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: KaladaV1Limits): KaladaV1Outcome<KaladaValue>;
|
|
6
|
+
|
|
7
|
+
export { evaluateKaladaV1 };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { JsonValue } from './json.js';
|
|
2
|
+
import { KaladaV1Expression, KaladaV1Resolver, KaladaV1Limits, KaladaV1Outcome } from './types.js';
|
|
3
|
+
import { KaladaValue } from './values.js';
|
|
4
|
+
|
|
5
|
+
declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: KaladaV1Limits): KaladaV1Outcome<KaladaValue>;
|
|
6
|
+
|
|
7
|
+
export { evaluateKaladaV1 };
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { rejectCallbackPromise } from '../kuery-v1/callback-promise.js';
|
|
2
|
+
import { success, KaladaFailure, failure } from './diagnostics.js';
|
|
3
|
+
import { cloneJson, dataValue } from './json.js';
|
|
4
|
+
import { Option, Result, isOption, isResult, validateKaladaValueLimits } from './values.js';
|
|
5
|
+
|
|
6
|
+
function evaluateKaladaV1(expression, resolve, limits) {
|
|
7
|
+
try {
|
|
8
|
+
return success(
|
|
9
|
+
evaluateNode(expression, ["expression"], /* @__PURE__ */ new Map(), { resolve, limits, steps: 0 })
|
|
10
|
+
);
|
|
11
|
+
} catch (error) {
|
|
12
|
+
const problem = error instanceof KaladaFailure ? error : new KaladaFailure("KALADA_REFERENCE_ERROR", []);
|
|
13
|
+
return failure(problem.code, problem.path);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function evaluateNode(node, path, scope, state) {
|
|
17
|
+
charge(path, state);
|
|
18
|
+
if (node.kind === "literal") return node.value;
|
|
19
|
+
if (node.kind === "ref") return evaluateReference(node.ref, path, scope, state);
|
|
20
|
+
if (node.kind === "binding") return evaluateBinding(node, path, scope, state);
|
|
21
|
+
if (node.kind === "option") {
|
|
22
|
+
return node.variant === "none" ? Option.none() : Option.some(evaluateNode(node.value, [...path, "value"], scope, state));
|
|
23
|
+
}
|
|
24
|
+
if (node.kind === "result") {
|
|
25
|
+
const value = evaluateNode(node.value, [...path, "value"], scope, state);
|
|
26
|
+
return node.variant === "ok" ? Result.ok(value) : Result.err(value);
|
|
27
|
+
}
|
|
28
|
+
return evaluateMatch(node, path, scope, state);
|
|
29
|
+
}
|
|
30
|
+
function evaluateBinding(node, path, scope, state) {
|
|
31
|
+
const value = evaluateNode(node.value, [...path, "value"], scope, state);
|
|
32
|
+
const nested = new Map(scope);
|
|
33
|
+
nested.set(node.name, value);
|
|
34
|
+
return evaluateNode(node.body, [...path, "body"], nested, state);
|
|
35
|
+
}
|
|
36
|
+
function evaluateMatch(node, path, scope, state) {
|
|
37
|
+
const valuePath = [...path, "value"];
|
|
38
|
+
const value = evaluateNode(node.value, valuePath, scope, state);
|
|
39
|
+
if (node.type === "Option" && !isOption(value)) {
|
|
40
|
+
throw new KaladaFailure("KALADA_MATCH_TYPE_MISMATCH", valuePath);
|
|
41
|
+
}
|
|
42
|
+
if (node.type === "Result" && !isResult(value)) {
|
|
43
|
+
throw new KaladaFailure("KALADA_MATCH_TYPE_MISMATCH", valuePath);
|
|
44
|
+
}
|
|
45
|
+
if (!isOption(value) && !isResult(value)) {
|
|
46
|
+
throw new KaladaFailure("KALADA_MATCH_TYPE_MISMATCH", valuePath);
|
|
47
|
+
}
|
|
48
|
+
const variant = value.variant;
|
|
49
|
+
const armIndex = node.arms.findIndex((candidate) => candidate.variant === variant);
|
|
50
|
+
const arm = node.arms[armIndex];
|
|
51
|
+
if (!arm) throw new KaladaFailure("KALADA_INVALID_INPUT", [...path, "arms"]);
|
|
52
|
+
const nested = bindPayload(scope, arm, value);
|
|
53
|
+
return evaluateNode(arm.body, [...path, "arms", armIndex, "body"], nested, state);
|
|
54
|
+
}
|
|
55
|
+
function bindPayload(scope, arm, value) {
|
|
56
|
+
if (!arm.binding || !isOption(value) && !isResult(value) || value.variant === "none")
|
|
57
|
+
return scope;
|
|
58
|
+
const nested = new Map(scope);
|
|
59
|
+
nested.set(arm.binding, value.value);
|
|
60
|
+
return nested;
|
|
61
|
+
}
|
|
62
|
+
function evaluateReference(reference, path, scope, state) {
|
|
63
|
+
if (typeof reference === "string" && scope.has(reference))
|
|
64
|
+
return scope.get(reference);
|
|
65
|
+
let input;
|
|
66
|
+
try {
|
|
67
|
+
input = state.resolve(reference);
|
|
68
|
+
} catch {
|
|
69
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
70
|
+
}
|
|
71
|
+
if (rejectCallbackPromise(input)) throw new KaladaFailure("KALADA_ASYNC_UNSUPPORTED", path);
|
|
72
|
+
return parseResolution(input, path, state.limits);
|
|
73
|
+
}
|
|
74
|
+
function parseResolution(input, path, limits) {
|
|
75
|
+
if (typeof input !== "object" || input === null || Array.isArray(input)) {
|
|
76
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
77
|
+
}
|
|
78
|
+
const keys = safeKeys(input, path);
|
|
79
|
+
const found = safeData(input, "found", path);
|
|
80
|
+
if (typeof found !== "boolean") throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
81
|
+
if (!found) return missingResolution(input, keys, path);
|
|
82
|
+
if (keys.length !== 2 || !keys.includes("value"))
|
|
83
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
84
|
+
return safeValue(safeData(input, "value", path), path, limits);
|
|
85
|
+
}
|
|
86
|
+
function missingResolution(input, keys, path) {
|
|
87
|
+
if (keys.length === 1) throw new KaladaFailure("KALADA_REFERENCE_MISSING", path);
|
|
88
|
+
if (keys.length !== 2 || !keys.includes("reason"))
|
|
89
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
90
|
+
const reason = safeData(input, "reason", path);
|
|
91
|
+
if (reason === void 0 || reason === "missing")
|
|
92
|
+
throw new KaladaFailure("KALADA_REFERENCE_MISSING", path);
|
|
93
|
+
if (reason === "denied") throw new KaladaFailure("KALADA_REFERENCE_DENIED", path);
|
|
94
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
95
|
+
}
|
|
96
|
+
function safeValue(input, path, limits) {
|
|
97
|
+
try {
|
|
98
|
+
if (isOption(input) || isResult(input)) {
|
|
99
|
+
validateKaladaValueLimits(input, {
|
|
100
|
+
maxDepth: limits.maxValueDepth,
|
|
101
|
+
maxNodes: limits.maxValueNodes,
|
|
102
|
+
maxStringLength: limits.maxStringLength
|
|
103
|
+
});
|
|
104
|
+
return input;
|
|
105
|
+
}
|
|
106
|
+
return cloneJson(input, {
|
|
107
|
+
maxDepth: limits.maxValueDepth,
|
|
108
|
+
maxNodes: limits.maxValueNodes,
|
|
109
|
+
maxStringLength: limits.maxStringLength
|
|
110
|
+
});
|
|
111
|
+
} catch (error) {
|
|
112
|
+
if (error instanceof RangeError) throw new KaladaFailure("KALADA_LIMIT_EXCEEDED", path);
|
|
113
|
+
throw new KaladaFailure("KALADA_INVALID_RESULT", path);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function safeKeys(input, path) {
|
|
117
|
+
try {
|
|
118
|
+
return Reflect.ownKeys(input);
|
|
119
|
+
} catch {
|
|
120
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function safeData(input, key, path) {
|
|
124
|
+
try {
|
|
125
|
+
return dataValue(input, key);
|
|
126
|
+
} catch {
|
|
127
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function charge(path, state) {
|
|
131
|
+
state.steps += 1;
|
|
132
|
+
if (state.steps > state.limits.maxEvaluationSteps) {
|
|
133
|
+
throw new KaladaFailure("KALADA_EVALUATION_LIMIT", path);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export { evaluateKaladaV1 };
|
|
138
|
+
//# sourceMappingURL=evaluate.js.map
|
|
139
|
+
//# sourceMappingURL=evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/evaluate.ts"],"names":[],"mappings":"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","file":"evaluate.js","sourcesContent":["import { rejectCallbackPromise } from \"../kuery-v1/callback-promise.js\";\nimport { failure, KaladaFailure, success } from \"./diagnostics.js\";\nimport { cloneJson, dataValue, type JsonValue } from \"./json.js\";\nimport type {\n KaladaV1Expression,\n KaladaV1Limits,\n KaladaV1Outcome,\n KaladaV1Resolver,\n MatchArm,\n} from \"./types.js\";\nimport {\n isOption,\n isResult,\n type KaladaValue,\n Option,\n Result,\n validateKaladaValueLimits,\n} from \"./values.js\";\n\ntype Path = readonly (string | number)[];\ninterface State<R extends JsonValue> {\n readonly resolve: KaladaV1Resolver<R>;\n readonly limits: KaladaV1Limits;\n steps: number;\n}\n\nexport function evaluateKaladaV1<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n resolve: KaladaV1Resolver<R>,\n limits: KaladaV1Limits,\n): KaladaV1Outcome<KaladaValue> {\n try {\n return success(\n evaluateNode(expression, [\"expression\"], new Map(), { resolve, limits, steps: 0 }),\n );\n } catch (error) {\n const problem =\n error instanceof KaladaFailure ? error : new KaladaFailure(\"KALADA_REFERENCE_ERROR\", []);\n return failure(problem.code, problem.path);\n }\n}\n\nfunction evaluateNode<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n charge(path, state);\n if (node.kind === \"literal\") return node.value;\n if (node.kind === \"ref\") return evaluateReference(node.ref, path, scope, state);\n if (node.kind === \"binding\") return evaluateBinding(node, path, scope, state);\n if (node.kind === \"option\") {\n return node.variant === \"none\"\n ? Option.none()\n : Option.some(evaluateNode(node.value, [...path, \"value\"], scope, state));\n }\n if (node.kind === \"result\") {\n const value = evaluateNode(node.value, [...path, \"value\"], scope, state);\n return node.variant === \"ok\" ? Result.ok(value) : Result.err(value);\n }\n return evaluateMatch(node, path, scope, state);\n}\n\nfunction evaluateBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n const value = evaluateNode(node.value, [...path, \"value\"], scope, state);\n const nested = new Map(scope);\n nested.set(node.name, value);\n return evaluateNode(node.body, [...path, \"body\"], nested, state);\n}\n\nfunction evaluateMatch<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"match\" }>,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n const valuePath = [...path, \"value\"];\n const value = evaluateNode(node.value, valuePath, scope, state);\n if (node.type === \"Option\" && !isOption(value)) {\n throw new KaladaFailure(\"KALADA_MATCH_TYPE_MISMATCH\", valuePath);\n }\n if (node.type === \"Result\" && !isResult(value)) {\n throw new KaladaFailure(\"KALADA_MATCH_TYPE_MISMATCH\", valuePath);\n }\n if (!isOption(value) && !isResult(value)) {\n throw new KaladaFailure(\"KALADA_MATCH_TYPE_MISMATCH\", valuePath);\n }\n const variant = value.variant;\n const armIndex = node.arms.findIndex((candidate) => candidate.variant === variant);\n const arm = node.arms[armIndex];\n if (!arm) throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"arms\"]);\n const nested = bindPayload(scope, arm, value);\n return evaluateNode(arm.body, [...path, \"arms\", armIndex, \"body\"], nested, state);\n}\n\nfunction bindPayload(\n scope: ReadonlyMap<string, KaladaValue>,\n arm: MatchArm<JsonValue>,\n value: KaladaValue,\n): ReadonlyMap<string, KaladaValue> {\n if (!arm.binding || (!isOption(value) && !isResult(value)) || value.variant === \"none\")\n return scope;\n const nested = new Map(scope);\n nested.set(arm.binding, value.value);\n return nested;\n}\n\nfunction evaluateReference<R extends JsonValue>(\n reference: R,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n if (typeof reference === \"string\" && scope.has(reference))\n return scope.get(reference) as KaladaValue;\n let input: unknown;\n try {\n input = state.resolve(reference);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n if (rejectCallbackPromise(input)) throw new KaladaFailure(\"KALADA_ASYNC_UNSUPPORTED\", path);\n return parseResolution(input, path, state.limits);\n}\n\nfunction parseResolution(input: unknown, path: Path, limits: KaladaV1Limits): KaladaValue {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n const keys = safeKeys(input, path);\n const found = safeData(input, \"found\", path);\n if (typeof found !== \"boolean\") throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n if (!found) return missingResolution(input, keys, path);\n if (keys.length !== 2 || !keys.includes(\"value\"))\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n return safeValue(safeData(input, \"value\", path), path, limits);\n}\n\nfunction missingResolution(input: object, keys: readonly PropertyKey[], path: Path): never {\n if (keys.length === 1) throw new KaladaFailure(\"KALADA_REFERENCE_MISSING\", path);\n if (keys.length !== 2 || !keys.includes(\"reason\"))\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n const reason = safeData(input, \"reason\", path);\n if (reason === undefined || reason === \"missing\")\n throw new KaladaFailure(\"KALADA_REFERENCE_MISSING\", path);\n if (reason === \"denied\") throw new KaladaFailure(\"KALADA_REFERENCE_DENIED\", path);\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n}\n\nfunction safeValue(input: unknown, path: Path, limits: KaladaV1Limits): KaladaValue {\n try {\n if (isOption(input) || isResult(input)) {\n validateKaladaValueLimits(input, {\n maxDepth: limits.maxValueDepth,\n maxNodes: limits.maxValueNodes,\n maxStringLength: limits.maxStringLength,\n });\n return input;\n }\n return cloneJson(input, {\n maxDepth: limits.maxValueDepth,\n maxNodes: limits.maxValueNodes,\n maxStringLength: limits.maxStringLength,\n });\n } catch (error) {\n if (error instanceof RangeError) throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n throw new KaladaFailure(\"KALADA_INVALID_RESULT\", path);\n }\n}\n\nfunction safeKeys(input: object, path: Path): PropertyKey[] {\n try {\n return Reflect.ownKeys(input);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n}\n\nfunction safeData(input: object, key: string, path: Path): unknown {\n try {\n return dataValue(input, key);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n}\n\nfunction charge<R extends JsonValue>(path: Path, state: State<R>): void {\n state.steps += 1;\n if (state.steps > state.limits.maxEvaluationSteps) {\n throw new KaladaFailure(\"KALADA_EVALUATION_LIMIT\", path);\n }\n}\n"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const literal = (value) => ({
|
|
4
|
+
kind: "literal",
|
|
5
|
+
value
|
|
6
|
+
});
|
|
7
|
+
const ref = (value) => ({
|
|
8
|
+
kind: "ref",
|
|
9
|
+
ref: value
|
|
10
|
+
});
|
|
11
|
+
const binding = (name, value, body) => ({ kind: "binding", name, value, body });
|
|
12
|
+
const some = (value) => ({
|
|
13
|
+
kind: "option",
|
|
14
|
+
variant: "some",
|
|
15
|
+
value
|
|
16
|
+
});
|
|
17
|
+
const none = () => ({
|
|
18
|
+
kind: "option",
|
|
19
|
+
variant: "none"
|
|
20
|
+
});
|
|
21
|
+
const ok = (value) => ({
|
|
22
|
+
kind: "result",
|
|
23
|
+
variant: "ok",
|
|
24
|
+
value
|
|
25
|
+
});
|
|
26
|
+
const err = (value) => ({
|
|
27
|
+
kind: "result",
|
|
28
|
+
variant: "err",
|
|
29
|
+
value
|
|
30
|
+
});
|
|
31
|
+
const arm = (variant, body, name) => ({ variant, ...name === void 0 ? {} : { binding: name }, body });
|
|
32
|
+
const match = (type, value, arms) => ({ kind: "match", type, value, arms });
|
|
33
|
+
const KaladaV1 = Object.freeze({
|
|
34
|
+
literal,
|
|
35
|
+
ref,
|
|
36
|
+
binding,
|
|
37
|
+
Option: Object.freeze({ some, none }),
|
|
38
|
+
Result: Object.freeze({ ok, err }),
|
|
39
|
+
arm,
|
|
40
|
+
match,
|
|
41
|
+
program(expression) {
|
|
42
|
+
return { format: "kalada-program", version: 1, profile: "kalada-v1", expression };
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
exports.KaladaV1 = KaladaV1;
|
|
47
|
+
//# sourceMappingURL=factories.cjs.map
|
|
48
|
+
//# sourceMappingURL=factories.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/factories.ts"],"names":[],"mappings":";;AAGA,MAAM,OAAA,GAAU,CAA+B,KAAA,MAA6C;AAAA,EAC1F,IAAA,EAAM,SAAA;AAAA,EACN;AACF,CAAA,CAAA;AACA,MAAM,GAAA,GAAM,CAA+B,KAAA,MAAqC;AAAA,EAC9E,IAAA,EAAM,KAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA,CAAA;AACA,MAAM,OAAA,GAAU,CACd,IAAA,EACA,KAAA,EACA,IAAA,MAC2B,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,CAAA;AAClE,MAAM,IAAA,GAAO,CAAsB,KAAA,MAAyD;AAAA,EAC1F,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,MAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,OAAO,OAA4D;AAAA,EACvE,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA,CAAA;AACA,MAAM,EAAA,GAAK,CAAsB,KAAA,MAAyD;AAAA,EACxF,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,IAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,GAAA,GAAM,CAAsB,KAAA,MAAyD;AAAA,EACzF,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,KAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,MAAM,CACV,OAAA,EACA,IAAA,EACA,IAAA,MACiB,EAAE,OAAA,EAAS,GAAI,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAS,IAAA,IAAS,IAAA,EAAK,CAAA;AACrF,MAAM,KAAA,GAAQ,CACZ,IAAA,EACA,KAAA,EACA,IAAA,MAC2B,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,CAAA;AAEzD,MAAM,QAAA,GAAW,OAAO,MAAA,CAAO;AAAA,EACpC,OAAA;AAAA,EACA,GAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC,QAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,EAAA,EAAI,KAAK,CAAA;AAAA,EACjC,GAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAsC,UAAA,EAAuD;AAC3F,IAAA,OAAO,EAAE,MAAA,EAAQ,gBAAA,EAAkB,SAAS,CAAA,EAAG,OAAA,EAAS,aAAa,UAAA,EAAW;AAAA,EAClF;AACF,CAAC","file":"factories.cjs","sourcesContent":["import type { JsonValue } from \"./json.js\";\nimport type { KaladaV1Expression, KaladaV1Program, MatchArm } from \"./types.js\";\n\nconst literal = <R extends JsonValue = string>(value: JsonValue): KaladaV1Expression<R> => ({\n kind: \"literal\",\n value,\n});\nconst ref = <R extends JsonValue = string>(value: R): KaladaV1Expression<R> => ({\n kind: \"ref\",\n ref: value,\n});\nconst binding = <R extends JsonValue>(\n name: string,\n value: KaladaV1Expression<R>,\n body: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"binding\", name, value, body });\nconst some = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"some\",\n value,\n});\nconst none = <R extends JsonValue = string>(): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"none\",\n});\nconst ok = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"ok\",\n value,\n});\nconst err = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"err\",\n value,\n});\nconst arm = <R extends JsonValue>(\n variant: MatchArm<R>[\"variant\"],\n body: KaladaV1Expression<R>,\n name?: string,\n): MatchArm<R> => ({ variant, ...(name === undefined ? {} : { binding: name }), body });\nconst match = <R extends JsonValue>(\n type: \"Option\" | \"Result\",\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n): KaladaV1Expression<R> => ({ kind: \"match\", type, value, arms });\n\nexport const KaladaV1 = Object.freeze({\n literal,\n ref,\n binding,\n Option: Object.freeze({ some, none }),\n Result: Object.freeze({ ok, err }),\n arm,\n match,\n program<R extends JsonValue = string>(expression: KaladaV1Expression<R>): KaladaV1Program<R> {\n return { format: \"kalada-program\", version: 1, profile: \"kalada-v1\", expression };\n },\n});\n"]}
|