@kalada/core 0.1.0 → 0.3.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/canonical-input.cjs +133 -0
- package/dist/kalada-v1/canonical-input.cjs.map +1 -0
- package/dist/kalada-v1/canonical-input.d.cts +25 -0
- package/dist/kalada-v1/canonical-input.d.ts +25 -0
- package/dist/kalada-v1/canonical-input.js +122 -0
- package/dist/kalada-v1/canonical-input.js.map +1 -0
- package/dist/kalada-v1/canonicalize.cjs +214 -0
- package/dist/kalada-v1/canonicalize.cjs.map +1 -0
- package/dist/kalada-v1/canonicalize.d.cts +8 -0
- package/dist/kalada-v1/canonicalize.d.ts +8 -0
- package/dist/kalada-v1/canonicalize.js +212 -0
- package/dist/kalada-v1/canonicalize.js.map +1 -0
- package/dist/kalada-v1/codec.cjs +173 -0
- package/dist/kalada-v1/codec.cjs.map +1 -0
- package/dist/kalada-v1/codec.d.cts +32 -0
- package/dist/kalada-v1/codec.d.ts +32 -0
- package/dist/kalada-v1/codec.js +170 -0
- package/dist/kalada-v1/codec.js.map +1 -0
- package/dist/kalada-v1/compile.cjs +45 -0
- package/dist/kalada-v1/compile.cjs.map +1 -0
- package/dist/kalada-v1/compile.d.cts +8 -0
- package/dist/kalada-v1/compile.d.ts +8 -0
- package/dist/kalada-v1/compile.js +43 -0
- package/dist/kalada-v1/compile.js.map +1 -0
- package/dist/kalada-v1/dependencies.cjs +58 -0
- package/dist/kalada-v1/dependencies.cjs.map +1 -0
- package/dist/kalada-v1/dependencies.d.cts +8 -0
- package/dist/kalada-v1/dependencies.d.ts +8 -0
- package/dist/kalada-v1/dependencies.js +56 -0
- package/dist/kalada-v1/dependencies.js.map +1 -0
- package/dist/kalada-v1/diagnostics.cjs +49 -0
- package/dist/kalada-v1/diagnostics.cjs.map +1 -0
- package/dist/kalada-v1/diagnostics.d.cts +14 -0
- package/dist/kalada-v1/diagnostics.d.ts +14 -0
- package/dist/kalada-v1/diagnostics.js +45 -0
- package/dist/kalada-v1/diagnostics.js.map +1 -0
- package/dist/kalada-v1/evaluate.cjs +176 -0
- package/dist/kalada-v1/evaluate.cjs.map +1 -0
- package/dist/kalada-v1/evaluate.d.cts +8 -0
- package/dist/kalada-v1/evaluate.d.ts +8 -0
- package/dist/kalada-v1/evaluate.js +174 -0
- package/dist/kalada-v1/evaluate.js.map +1 -0
- package/dist/kalada-v1/factories.cjs +66 -0
- package/dist/kalada-v1/factories.cjs.map +1 -0
- package/dist/kalada-v1/factories.d.cts +30 -0
- package/dist/kalada-v1/factories.d.ts +30 -0
- package/dist/kalada-v1/factories.js +64 -0
- package/dist/kalada-v1/factories.js.map +1 -0
- package/dist/kalada-v1/index.cjs +88 -0
- package/dist/kalada-v1/index.cjs.map +1 -0
- package/dist/kalada-v1/index.d.cts +11 -0
- package/dist/kalada-v1/index.d.ts +11 -0
- package/dist/kalada-v1/index.js +11 -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 +9 -0
- package/dist/kalada-v1/limits.d.ts +9 -0
- package/dist/kalada-v1/limits.js +31 -0
- package/dist/kalada-v1/limits.js.map +1 -0
- package/dist/kalada-v1/schemas.cjs +182 -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 +179 -0
- package/dist/kalada-v1/schemas.js.map +1 -0
- package/dist/kalada-v1/temporal-evaluation.cjs +74 -0
- package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -0
- package/dist/kalada-v1/temporal-evaluation.d.cts +13 -0
- package/dist/kalada-v1/temporal-evaluation.d.ts +13 -0
- package/dist/kalada-v1/temporal-evaluation.js +71 -0
- package/dist/kalada-v1/temporal-evaluation.js.map +1 -0
- package/dist/kalada-v1/temporal.cjs +42 -0
- package/dist/kalada-v1/temporal.cjs.map +1 -0
- package/dist/kalada-v1/temporal.d.cts +22 -0
- package/dist/kalada-v1/temporal.d.ts +22 -0
- package/dist/kalada-v1/temporal.js +37 -0
- package/dist/kalada-v1/temporal.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 +120 -0
- package/dist/kalada-v1/types.d.ts +120 -0
- package/dist/kalada-v1/types.js +3 -0
- package/dist/kalada-v1/types.js.map +1 -0
- package/dist/kalada-v1/values.cjs +112 -0
- package/dist/kalada-v1/values.cjs.map +1 -0
- package/dist/kalada-v1/values.d.cts +49 -0
- package/dist/kalada-v1/values.d.ts +49 -0
- package/dist/kalada-v1/values.js +105 -0
- package/dist/kalada-v1/values.js.map +1 -0
- package/package.json +11 -1
|
@@ -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,uDAAA;AAAA,EACzB,uBAAA,EAAyB,yDAAA;AAAA,EACzB,6BAAA,EAA+B,yDAAA;AAAA,EAC/B,wBAAA,EAA0B,gEAAA;AAAA,EAC1B,kBAAA,EAAoB,+BAAA;AAAA,EACpB,oBAAA,EAAsB;AACxB,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 KALADA_INSTANT_REQUIRED: \"Kalada evaluation requires an explicit current Instant.\",\n KALADA_TEMPORAL_TYPE_MISMATCH: \"Kalada temporal operation received incompatible values.\",\n KALADA_TEMPORAL_OVERFLOW: \"Kalada temporal arithmetic exceeded safe integer milliseconds.\",\n KALADA_CLOCK_ERROR: \"Kalada clock sampling failed.\",\n KALADA_INVALID_CLOCK: \"Kalada clock returned an invalid Instant.\",\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,176 @@
|
|
|
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 temporal_js = require('./temporal.js');
|
|
7
|
+
var temporalEvaluation_js = require('./temporal-evaluation.js');
|
|
8
|
+
var values_js = require('./values.js');
|
|
9
|
+
|
|
10
|
+
function evaluateKaladaV1(expression, resolve, limits, inputs = {}) {
|
|
11
|
+
try {
|
|
12
|
+
const instant = evaluationInstant(inputs);
|
|
13
|
+
return diagnostics_js.success(
|
|
14
|
+
evaluateNode(expression, ["expression"], /* @__PURE__ */ new Map(), { resolve, limits, instant, steps: 0 })
|
|
15
|
+
);
|
|
16
|
+
} catch (error) {
|
|
17
|
+
const problem = error instanceof diagnostics_js.KaladaFailure ? error : new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", []);
|
|
18
|
+
return diagnostics_js.failure(problem.code, problem.path);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function evaluateNode(node, path, scope, state) {
|
|
22
|
+
charge(path, state);
|
|
23
|
+
if (node.kind === "literal") return node.value;
|
|
24
|
+
if (temporalEvaluation_js.isTemporalExpression(node)) {
|
|
25
|
+
return temporalEvaluation_js.evaluateTemporalExpression(
|
|
26
|
+
node,
|
|
27
|
+
path,
|
|
28
|
+
state.instant,
|
|
29
|
+
(child, childPath) => evaluateNode(child, childPath, scope, state)
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
if (node.kind === "ref") return evaluateReference(node.ref, path, scope, state);
|
|
33
|
+
if (node.kind === "binding") return evaluateBinding(node, path, scope, state);
|
|
34
|
+
if (node.kind === "option") {
|
|
35
|
+
return node.variant === "none" ? values_js.Option.none() : values_js.Option.some(evaluateNode(node.value, [...path, "value"], scope, state));
|
|
36
|
+
}
|
|
37
|
+
if (node.kind === "result") {
|
|
38
|
+
const value = evaluateNode(node.value, [...path, "value"], scope, state);
|
|
39
|
+
return node.variant === "ok" ? values_js.Result.ok(value) : values_js.Result.err(value);
|
|
40
|
+
}
|
|
41
|
+
return evaluateMatch(node, path, scope, state);
|
|
42
|
+
}
|
|
43
|
+
function evaluationInstant(inputs) {
|
|
44
|
+
let keys;
|
|
45
|
+
try {
|
|
46
|
+
if (typeof inputs !== "object" || inputs === null || Array.isArray(inputs))
|
|
47
|
+
throw new TypeError();
|
|
48
|
+
keys = Reflect.ownKeys(inputs);
|
|
49
|
+
} catch {
|
|
50
|
+
throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
|
|
51
|
+
}
|
|
52
|
+
const unexpected = keys.find((key) => key !== "instant");
|
|
53
|
+
if (unexpected !== void 0)
|
|
54
|
+
throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", String(unexpected)]);
|
|
55
|
+
if (!keys.includes("instant")) return void 0;
|
|
56
|
+
let instant;
|
|
57
|
+
try {
|
|
58
|
+
instant = json_js.dataValue(inputs, "instant");
|
|
59
|
+
} catch {
|
|
60
|
+
throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
|
|
61
|
+
}
|
|
62
|
+
if (instant !== void 0 && !temporal_js.isInstant(instant)) {
|
|
63
|
+
throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
|
|
64
|
+
}
|
|
65
|
+
return instant;
|
|
66
|
+
}
|
|
67
|
+
function evaluateBinding(node, path, scope, state) {
|
|
68
|
+
const value = evaluateNode(node.value, [...path, "value"], scope, state);
|
|
69
|
+
const nested = new Map(scope);
|
|
70
|
+
nested.set(node.name, value);
|
|
71
|
+
return evaluateNode(node.body, [...path, "body"], nested, state);
|
|
72
|
+
}
|
|
73
|
+
function evaluateMatch(node, path, scope, state) {
|
|
74
|
+
const valuePath = [...path, "value"];
|
|
75
|
+
const value = evaluateNode(node.value, valuePath, scope, state);
|
|
76
|
+
if (node.type === "Option" && !values_js.isOption(value)) {
|
|
77
|
+
throw new diagnostics_js.KaladaFailure("KALADA_MATCH_TYPE_MISMATCH", valuePath);
|
|
78
|
+
}
|
|
79
|
+
if (node.type === "Result" && !values_js.isResult(value)) {
|
|
80
|
+
throw new diagnostics_js.KaladaFailure("KALADA_MATCH_TYPE_MISMATCH", valuePath);
|
|
81
|
+
}
|
|
82
|
+
if (!values_js.isOption(value) && !values_js.isResult(value)) {
|
|
83
|
+
throw new diagnostics_js.KaladaFailure("KALADA_MATCH_TYPE_MISMATCH", valuePath);
|
|
84
|
+
}
|
|
85
|
+
const variant = value.variant;
|
|
86
|
+
const armIndex = node.arms.findIndex((candidate) => candidate.variant === variant);
|
|
87
|
+
const arm = node.arms[armIndex];
|
|
88
|
+
if (!arm) throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", [...path, "arms"]);
|
|
89
|
+
const nested = bindPayload(scope, arm, value);
|
|
90
|
+
return evaluateNode(arm.body, [...path, "arms", armIndex, "body"], nested, state);
|
|
91
|
+
}
|
|
92
|
+
function bindPayload(scope, arm, value) {
|
|
93
|
+
if (!arm.binding || !values_js.isOption(value) && !values_js.isResult(value) || value.variant === "none")
|
|
94
|
+
return scope;
|
|
95
|
+
const nested = new Map(scope);
|
|
96
|
+
nested.set(arm.binding, value.value);
|
|
97
|
+
return nested;
|
|
98
|
+
}
|
|
99
|
+
function evaluateReference(reference, path, scope, state) {
|
|
100
|
+
if (typeof reference === "string" && scope.has(reference))
|
|
101
|
+
return scope.get(reference);
|
|
102
|
+
let input;
|
|
103
|
+
try {
|
|
104
|
+
input = state.resolve(reference);
|
|
105
|
+
} catch {
|
|
106
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
107
|
+
}
|
|
108
|
+
if (callbackPromise_js.rejectCallbackPromise(input)) throw new diagnostics_js.KaladaFailure("KALADA_ASYNC_UNSUPPORTED", path);
|
|
109
|
+
return parseResolution(input, path, state.limits);
|
|
110
|
+
}
|
|
111
|
+
function parseResolution(input, path, limits) {
|
|
112
|
+
if (typeof input !== "object" || input === null || Array.isArray(input)) {
|
|
113
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
114
|
+
}
|
|
115
|
+
const keys = safeKeys(input, path);
|
|
116
|
+
const found = safeData(input, "found", path);
|
|
117
|
+
if (typeof found !== "boolean") throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
118
|
+
if (!found) return missingResolution(input, keys, path);
|
|
119
|
+
if (keys.length !== 2 || !keys.includes("value"))
|
|
120
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
121
|
+
return safeValue(safeData(input, "value", path), path, limits);
|
|
122
|
+
}
|
|
123
|
+
function missingResolution(input, keys, path) {
|
|
124
|
+
if (keys.length === 1) throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_MISSING", path);
|
|
125
|
+
if (keys.length !== 2 || !keys.includes("reason"))
|
|
126
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
127
|
+
const reason = safeData(input, "reason", path);
|
|
128
|
+
if (reason === void 0 || reason === "missing")
|
|
129
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_MISSING", path);
|
|
130
|
+
if (reason === "denied") throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_DENIED", path);
|
|
131
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
132
|
+
}
|
|
133
|
+
function safeValue(input, path, limits) {
|
|
134
|
+
try {
|
|
135
|
+
if (values_js.isOption(input) || values_js.isResult(input) || temporal_js.isInstant(input) || temporal_js.isDuration(input)) {
|
|
136
|
+
values_js.validateKaladaValueLimits(input, {
|
|
137
|
+
maxDepth: limits.maxValueDepth,
|
|
138
|
+
maxNodes: limits.maxValueNodes,
|
|
139
|
+
maxStringLength: limits.maxStringLength
|
|
140
|
+
});
|
|
141
|
+
return input;
|
|
142
|
+
}
|
|
143
|
+
return json_js.cloneJson(input, {
|
|
144
|
+
maxDepth: limits.maxValueDepth,
|
|
145
|
+
maxNodes: limits.maxValueNodes,
|
|
146
|
+
maxStringLength: limits.maxStringLength
|
|
147
|
+
});
|
|
148
|
+
} catch (error) {
|
|
149
|
+
if (error instanceof RangeError) throw new diagnostics_js.KaladaFailure("KALADA_LIMIT_EXCEEDED", path);
|
|
150
|
+
throw new diagnostics_js.KaladaFailure("KALADA_INVALID_RESULT", path);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function safeKeys(input, path) {
|
|
154
|
+
try {
|
|
155
|
+
return Reflect.ownKeys(input);
|
|
156
|
+
} catch {
|
|
157
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function safeData(input, key, path) {
|
|
161
|
+
try {
|
|
162
|
+
return json_js.dataValue(input, key);
|
|
163
|
+
} catch {
|
|
164
|
+
throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function charge(path, state) {
|
|
168
|
+
state.steps += 1;
|
|
169
|
+
if (state.steps > state.limits.maxEvaluationSteps) {
|
|
170
|
+
throw new diagnostics_js.KaladaFailure("KALADA_EVALUATION_LIMIT", path);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
exports.evaluateKaladaV1 = evaluateKaladaV1;
|
|
175
|
+
//# sourceMappingURL=evaluate.cjs.map
|
|
176
|
+
//# sourceMappingURL=evaluate.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/evaluate.ts"],"names":["success","KaladaFailure","failure","isTemporalExpression","evaluateTemporalExpression","Option","Result","dataValue","isInstant","isOption","isResult","rejectCallbackPromise","isDuration","validateKaladaValueLimits","cloneJson"],"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 InstantValue, isDuration, isInstant } from \"./temporal.js\";\nimport { evaluateTemporalExpression, isTemporalExpression } from \"./temporal-evaluation.js\";\nimport type {\n KaladaV1EvaluationInputs,\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 readonly instant?: InstantValue;\n steps: number;\n}\n\nexport function evaluateKaladaV1<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n resolve: KaladaV1Resolver<R>,\n limits: KaladaV1Limits,\n inputs: KaladaV1EvaluationInputs = {},\n): KaladaV1Outcome<KaladaValue> {\n try {\n const instant = evaluationInstant(inputs);\n return success(\n evaluateNode(expression, [\"expression\"], new Map(), { resolve, limits, instant, 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 (isTemporalExpression(node)) {\n return evaluateTemporalExpression(node, path, state.instant, (child, childPath) =>\n evaluateNode(child, childPath, scope, state),\n );\n }\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 evaluationInstant(inputs: KaladaV1EvaluationInputs): State<JsonValue>[\"instant\"] {\n let keys: readonly PropertyKey[];\n try {\n if (typeof inputs !== \"object\" || inputs === null || Array.isArray(inputs))\n throw new TypeError();\n keys = Reflect.ownKeys(inputs);\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", \"instant\"]);\n }\n const unexpected = keys.find((key) => key !== \"instant\");\n if (unexpected !== undefined)\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", String(unexpected)]);\n if (!keys.includes(\"instant\")) return undefined;\n let instant: unknown;\n try {\n instant = dataValue(inputs, \"instant\");\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", \"instant\"]);\n }\n if (instant !== undefined && !isInstant(instant)) {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", \"instant\"]);\n }\n return instant;\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) || isInstant(input) || isDuration(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,8 @@
|
|
|
1
|
+
import { JsonValue } from './json.cjs';
|
|
2
|
+
import { KaladaV1Expression, KaladaV1Resolver, KaladaV1Limits, KaladaV1EvaluationInputs, KaladaV1Outcome } from './types.cjs';
|
|
3
|
+
import { KaladaValue } from './values.cjs';
|
|
4
|
+
import './temporal.cjs';
|
|
5
|
+
|
|
6
|
+
declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: KaladaV1Limits, inputs?: KaladaV1EvaluationInputs): KaladaV1Outcome<KaladaValue>;
|
|
7
|
+
|
|
8
|
+
export { evaluateKaladaV1 };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { JsonValue } from './json.js';
|
|
2
|
+
import { KaladaV1Expression, KaladaV1Resolver, KaladaV1Limits, KaladaV1EvaluationInputs, KaladaV1Outcome } from './types.js';
|
|
3
|
+
import { KaladaValue } from './values.js';
|
|
4
|
+
import './temporal.js';
|
|
5
|
+
|
|
6
|
+
declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: KaladaV1Limits, inputs?: KaladaV1EvaluationInputs): KaladaV1Outcome<KaladaValue>;
|
|
7
|
+
|
|
8
|
+
export { evaluateKaladaV1 };
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { rejectCallbackPromise } from '../kuery-v1/callback-promise.js';
|
|
2
|
+
import { success, KaladaFailure, failure } from './diagnostics.js';
|
|
3
|
+
import { dataValue, cloneJson } from './json.js';
|
|
4
|
+
import { isInstant, isDuration } from './temporal.js';
|
|
5
|
+
import { isTemporalExpression, evaluateTemporalExpression } from './temporal-evaluation.js';
|
|
6
|
+
import { Option, Result, isOption, isResult, validateKaladaValueLimits } from './values.js';
|
|
7
|
+
|
|
8
|
+
function evaluateKaladaV1(expression, resolve, limits, inputs = {}) {
|
|
9
|
+
try {
|
|
10
|
+
const instant = evaluationInstant(inputs);
|
|
11
|
+
return success(
|
|
12
|
+
evaluateNode(expression, ["expression"], /* @__PURE__ */ new Map(), { resolve, limits, instant, steps: 0 })
|
|
13
|
+
);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
const problem = error instanceof KaladaFailure ? error : new KaladaFailure("KALADA_REFERENCE_ERROR", []);
|
|
16
|
+
return failure(problem.code, problem.path);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function evaluateNode(node, path, scope, state) {
|
|
20
|
+
charge(path, state);
|
|
21
|
+
if (node.kind === "literal") return node.value;
|
|
22
|
+
if (isTemporalExpression(node)) {
|
|
23
|
+
return evaluateTemporalExpression(
|
|
24
|
+
node,
|
|
25
|
+
path,
|
|
26
|
+
state.instant,
|
|
27
|
+
(child, childPath) => evaluateNode(child, childPath, scope, state)
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
if (node.kind === "ref") return evaluateReference(node.ref, path, scope, state);
|
|
31
|
+
if (node.kind === "binding") return evaluateBinding(node, path, scope, state);
|
|
32
|
+
if (node.kind === "option") {
|
|
33
|
+
return node.variant === "none" ? Option.none() : Option.some(evaluateNode(node.value, [...path, "value"], scope, state));
|
|
34
|
+
}
|
|
35
|
+
if (node.kind === "result") {
|
|
36
|
+
const value = evaluateNode(node.value, [...path, "value"], scope, state);
|
|
37
|
+
return node.variant === "ok" ? Result.ok(value) : Result.err(value);
|
|
38
|
+
}
|
|
39
|
+
return evaluateMatch(node, path, scope, state);
|
|
40
|
+
}
|
|
41
|
+
function evaluationInstant(inputs) {
|
|
42
|
+
let keys;
|
|
43
|
+
try {
|
|
44
|
+
if (typeof inputs !== "object" || inputs === null || Array.isArray(inputs))
|
|
45
|
+
throw new TypeError();
|
|
46
|
+
keys = Reflect.ownKeys(inputs);
|
|
47
|
+
} catch {
|
|
48
|
+
throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
|
|
49
|
+
}
|
|
50
|
+
const unexpected = keys.find((key) => key !== "instant");
|
|
51
|
+
if (unexpected !== void 0)
|
|
52
|
+
throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", String(unexpected)]);
|
|
53
|
+
if (!keys.includes("instant")) return void 0;
|
|
54
|
+
let instant;
|
|
55
|
+
try {
|
|
56
|
+
instant = dataValue(inputs, "instant");
|
|
57
|
+
} catch {
|
|
58
|
+
throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
|
|
59
|
+
}
|
|
60
|
+
if (instant !== void 0 && !isInstant(instant)) {
|
|
61
|
+
throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
|
|
62
|
+
}
|
|
63
|
+
return instant;
|
|
64
|
+
}
|
|
65
|
+
function evaluateBinding(node, path, scope, state) {
|
|
66
|
+
const value = evaluateNode(node.value, [...path, "value"], scope, state);
|
|
67
|
+
const nested = new Map(scope);
|
|
68
|
+
nested.set(node.name, value);
|
|
69
|
+
return evaluateNode(node.body, [...path, "body"], nested, state);
|
|
70
|
+
}
|
|
71
|
+
function evaluateMatch(node, path, scope, state) {
|
|
72
|
+
const valuePath = [...path, "value"];
|
|
73
|
+
const value = evaluateNode(node.value, valuePath, scope, state);
|
|
74
|
+
if (node.type === "Option" && !isOption(value)) {
|
|
75
|
+
throw new KaladaFailure("KALADA_MATCH_TYPE_MISMATCH", valuePath);
|
|
76
|
+
}
|
|
77
|
+
if (node.type === "Result" && !isResult(value)) {
|
|
78
|
+
throw new KaladaFailure("KALADA_MATCH_TYPE_MISMATCH", valuePath);
|
|
79
|
+
}
|
|
80
|
+
if (!isOption(value) && !isResult(value)) {
|
|
81
|
+
throw new KaladaFailure("KALADA_MATCH_TYPE_MISMATCH", valuePath);
|
|
82
|
+
}
|
|
83
|
+
const variant = value.variant;
|
|
84
|
+
const armIndex = node.arms.findIndex((candidate) => candidate.variant === variant);
|
|
85
|
+
const arm = node.arms[armIndex];
|
|
86
|
+
if (!arm) throw new KaladaFailure("KALADA_INVALID_INPUT", [...path, "arms"]);
|
|
87
|
+
const nested = bindPayload(scope, arm, value);
|
|
88
|
+
return evaluateNode(arm.body, [...path, "arms", armIndex, "body"], nested, state);
|
|
89
|
+
}
|
|
90
|
+
function bindPayload(scope, arm, value) {
|
|
91
|
+
if (!arm.binding || !isOption(value) && !isResult(value) || value.variant === "none")
|
|
92
|
+
return scope;
|
|
93
|
+
const nested = new Map(scope);
|
|
94
|
+
nested.set(arm.binding, value.value);
|
|
95
|
+
return nested;
|
|
96
|
+
}
|
|
97
|
+
function evaluateReference(reference, path, scope, state) {
|
|
98
|
+
if (typeof reference === "string" && scope.has(reference))
|
|
99
|
+
return scope.get(reference);
|
|
100
|
+
let input;
|
|
101
|
+
try {
|
|
102
|
+
input = state.resolve(reference);
|
|
103
|
+
} catch {
|
|
104
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
105
|
+
}
|
|
106
|
+
if (rejectCallbackPromise(input)) throw new KaladaFailure("KALADA_ASYNC_UNSUPPORTED", path);
|
|
107
|
+
return parseResolution(input, path, state.limits);
|
|
108
|
+
}
|
|
109
|
+
function parseResolution(input, path, limits) {
|
|
110
|
+
if (typeof input !== "object" || input === null || Array.isArray(input)) {
|
|
111
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
112
|
+
}
|
|
113
|
+
const keys = safeKeys(input, path);
|
|
114
|
+
const found = safeData(input, "found", path);
|
|
115
|
+
if (typeof found !== "boolean") throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
116
|
+
if (!found) return missingResolution(input, keys, path);
|
|
117
|
+
if (keys.length !== 2 || !keys.includes("value"))
|
|
118
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
119
|
+
return safeValue(safeData(input, "value", path), path, limits);
|
|
120
|
+
}
|
|
121
|
+
function missingResolution(input, keys, path) {
|
|
122
|
+
if (keys.length === 1) throw new KaladaFailure("KALADA_REFERENCE_MISSING", path);
|
|
123
|
+
if (keys.length !== 2 || !keys.includes("reason"))
|
|
124
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
125
|
+
const reason = safeData(input, "reason", path);
|
|
126
|
+
if (reason === void 0 || reason === "missing")
|
|
127
|
+
throw new KaladaFailure("KALADA_REFERENCE_MISSING", path);
|
|
128
|
+
if (reason === "denied") throw new KaladaFailure("KALADA_REFERENCE_DENIED", path);
|
|
129
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
130
|
+
}
|
|
131
|
+
function safeValue(input, path, limits) {
|
|
132
|
+
try {
|
|
133
|
+
if (isOption(input) || isResult(input) || isInstant(input) || isDuration(input)) {
|
|
134
|
+
validateKaladaValueLimits(input, {
|
|
135
|
+
maxDepth: limits.maxValueDepth,
|
|
136
|
+
maxNodes: limits.maxValueNodes,
|
|
137
|
+
maxStringLength: limits.maxStringLength
|
|
138
|
+
});
|
|
139
|
+
return input;
|
|
140
|
+
}
|
|
141
|
+
return cloneJson(input, {
|
|
142
|
+
maxDepth: limits.maxValueDepth,
|
|
143
|
+
maxNodes: limits.maxValueNodes,
|
|
144
|
+
maxStringLength: limits.maxStringLength
|
|
145
|
+
});
|
|
146
|
+
} catch (error) {
|
|
147
|
+
if (error instanceof RangeError) throw new KaladaFailure("KALADA_LIMIT_EXCEEDED", path);
|
|
148
|
+
throw new KaladaFailure("KALADA_INVALID_RESULT", path);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function safeKeys(input, path) {
|
|
152
|
+
try {
|
|
153
|
+
return Reflect.ownKeys(input);
|
|
154
|
+
} catch {
|
|
155
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function safeData(input, key, path) {
|
|
159
|
+
try {
|
|
160
|
+
return dataValue(input, key);
|
|
161
|
+
} catch {
|
|
162
|
+
throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function charge(path, state) {
|
|
166
|
+
state.steps += 1;
|
|
167
|
+
if (state.steps > state.limits.maxEvaluationSteps) {
|
|
168
|
+
throw new KaladaFailure("KALADA_EVALUATION_LIMIT", path);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export { evaluateKaladaV1 };
|
|
173
|
+
//# sourceMappingURL=evaluate.js.map
|
|
174
|
+
//# 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 InstantValue, isDuration, isInstant } from \"./temporal.js\";\nimport { evaluateTemporalExpression, isTemporalExpression } from \"./temporal-evaluation.js\";\nimport type {\n KaladaV1EvaluationInputs,\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 readonly instant?: InstantValue;\n steps: number;\n}\n\nexport function evaluateKaladaV1<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n resolve: KaladaV1Resolver<R>,\n limits: KaladaV1Limits,\n inputs: KaladaV1EvaluationInputs = {},\n): KaladaV1Outcome<KaladaValue> {\n try {\n const instant = evaluationInstant(inputs);\n return success(\n evaluateNode(expression, [\"expression\"], new Map(), { resolve, limits, instant, 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 (isTemporalExpression(node)) {\n return evaluateTemporalExpression(node, path, state.instant, (child, childPath) =>\n evaluateNode(child, childPath, scope, state),\n );\n }\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 evaluationInstant(inputs: KaladaV1EvaluationInputs): State<JsonValue>[\"instant\"] {\n let keys: readonly PropertyKey[];\n try {\n if (typeof inputs !== \"object\" || inputs === null || Array.isArray(inputs))\n throw new TypeError();\n keys = Reflect.ownKeys(inputs);\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", \"instant\"]);\n }\n const unexpected = keys.find((key) => key !== \"instant\");\n if (unexpected !== undefined)\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", String(unexpected)]);\n if (!keys.includes(\"instant\")) return undefined;\n let instant: unknown;\n try {\n instant = dataValue(inputs, \"instant\");\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", \"instant\"]);\n }\n if (instant !== undefined && !isInstant(instant)) {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", \"instant\"]);\n }\n return instant;\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) || isInstant(input) || isDuration(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,66 @@
|
|
|
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 instant = (milliseconds) => ({
|
|
34
|
+
kind: "instant",
|
|
35
|
+
milliseconds
|
|
36
|
+
});
|
|
37
|
+
const duration = (milliseconds) => ({
|
|
38
|
+
kind: "duration",
|
|
39
|
+
milliseconds
|
|
40
|
+
});
|
|
41
|
+
const currentInstant = () => ({
|
|
42
|
+
kind: "current-instant"
|
|
43
|
+
});
|
|
44
|
+
const temporalArithmetic = (operator, left, right) => ({ kind: "temporal-arithmetic", operator, left, right });
|
|
45
|
+
const temporalComparison = (operator, left, right) => ({ kind: "temporal-comparison", operator, left, right });
|
|
46
|
+
const KaladaV1 = Object.freeze({
|
|
47
|
+
literal,
|
|
48
|
+
ref,
|
|
49
|
+
binding,
|
|
50
|
+
Option: Object.freeze({ some, none }),
|
|
51
|
+
Result: Object.freeze({ ok, err }),
|
|
52
|
+
arm,
|
|
53
|
+
match,
|
|
54
|
+
instant,
|
|
55
|
+
duration,
|
|
56
|
+
currentInstant,
|
|
57
|
+
temporalArithmetic,
|
|
58
|
+
temporalComparison,
|
|
59
|
+
program(expression) {
|
|
60
|
+
return { format: "kalada-program", version: 1, profile: "kalada-v1", expression };
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
exports.KaladaV1 = KaladaV1;
|
|
65
|
+
//# sourceMappingURL=factories.cjs.map
|
|
66
|
+
//# 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;AAChE,MAAM,OAAA,GAAU,CAA+B,YAAA,MAAiD;AAAA,EAC9F,IAAA,EAAM,SAAA;AAAA,EACN;AACF,CAAA,CAAA;AACA,MAAM,QAAA,GAAW,CAA+B,YAAA,MAAiD;AAAA,EAC/F,IAAA,EAAM,UAAA;AAAA,EACN;AACF,CAAA,CAAA;AACA,MAAM,iBAAiB,OAA4D;AAAA,EACjF,IAAA,EAAM;AACR,CAAA,CAAA;AACA,MAAM,kBAAA,GAAqB,CACzB,QAAA,EACA,IAAA,EACA,KAAA,MAC2B,EAAE,IAAA,EAAM,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM,CAAA;AAClF,MAAM,kBAAA,GAAqB,CACzB,QAAA,EACA,IAAA,EACA,KAAA,MAC2B,EAAE,IAAA,EAAM,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM,CAAA;AAE3E,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,OAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;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 });\nconst instant = <R extends JsonValue = string>(milliseconds: number): KaladaV1Expression<R> => ({\n kind: \"instant\",\n milliseconds,\n});\nconst duration = <R extends JsonValue = string>(milliseconds: number): KaladaV1Expression<R> => ({\n kind: \"duration\",\n milliseconds,\n});\nconst currentInstant = <R extends JsonValue = string>(): KaladaV1Expression<R> => ({\n kind: \"current-instant\",\n});\nconst temporalArithmetic = <R extends JsonValue>(\n operator: \"add\" | \"subtract\",\n left: KaladaV1Expression<R>,\n right: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"temporal-arithmetic\", operator, left, right });\nconst temporalComparison = <R extends JsonValue>(\n operator: Extract<KaladaV1Expression<R>, { kind: \"temporal-comparison\" }>[\"operator\"],\n left: KaladaV1Expression<R>,\n right: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"temporal-comparison\", operator, left, right });\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 instant,\n duration,\n currentInstant,\n temporalArithmetic,\n temporalComparison,\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"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { JsonValue } from './json.cjs';
|
|
2
|
+
import { KaladaV1Expression, MatchArm, KaladaV1Program } from './types.cjs';
|
|
3
|
+
import './temporal.cjs';
|
|
4
|
+
import './values.cjs';
|
|
5
|
+
|
|
6
|
+
declare const KaladaV1: Readonly<{
|
|
7
|
+
literal: <R extends JsonValue = string>(value: JsonValue) => KaladaV1Expression<R>;
|
|
8
|
+
ref: <R extends JsonValue = string>(value: R) => KaladaV1Expression<R>;
|
|
9
|
+
binding: <R extends JsonValue>(name: string, value: KaladaV1Expression<R>, body: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
10
|
+
Option: Readonly<{
|
|
11
|
+
some: <R extends JsonValue>(value: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
12
|
+
none: <R extends JsonValue = string>() => KaladaV1Expression<R>;
|
|
13
|
+
}>;
|
|
14
|
+
Result: Readonly<{
|
|
15
|
+
ok: <R extends JsonValue>(value: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
16
|
+
err: <R extends JsonValue>(value: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
17
|
+
}>;
|
|
18
|
+
arm: <R extends JsonValue>(variant: MatchArm<R>["variant"], body: KaladaV1Expression<R>, name?: string) => MatchArm<R>;
|
|
19
|
+
match: <R extends JsonValue>(type: "Option" | "Result", value: KaladaV1Expression<R>, arms: readonly MatchArm<R>[]) => KaladaV1Expression<R>;
|
|
20
|
+
instant: <R extends JsonValue = string>(milliseconds: number) => KaladaV1Expression<R>;
|
|
21
|
+
duration: <R extends JsonValue = string>(milliseconds: number) => KaladaV1Expression<R>;
|
|
22
|
+
currentInstant: <R extends JsonValue = string>() => KaladaV1Expression<R>;
|
|
23
|
+
temporalArithmetic: <R extends JsonValue>(operator: "add" | "subtract", left: KaladaV1Expression<R>, right: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
24
|
+
temporalComparison: <R extends JsonValue>(operator: Extract<KaladaV1Expression<R>, {
|
|
25
|
+
kind: "temporal-comparison";
|
|
26
|
+
}>["operator"], left: KaladaV1Expression<R>, right: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
27
|
+
program<R extends JsonValue = string>(expression: KaladaV1Expression<R>): KaladaV1Program<R>;
|
|
28
|
+
}>;
|
|
29
|
+
|
|
30
|
+
export { KaladaV1 };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { JsonValue } from './json.js';
|
|
2
|
+
import { KaladaV1Expression, MatchArm, KaladaV1Program } from './types.js';
|
|
3
|
+
import './temporal.js';
|
|
4
|
+
import './values.js';
|
|
5
|
+
|
|
6
|
+
declare const KaladaV1: Readonly<{
|
|
7
|
+
literal: <R extends JsonValue = string>(value: JsonValue) => KaladaV1Expression<R>;
|
|
8
|
+
ref: <R extends JsonValue = string>(value: R) => KaladaV1Expression<R>;
|
|
9
|
+
binding: <R extends JsonValue>(name: string, value: KaladaV1Expression<R>, body: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
10
|
+
Option: Readonly<{
|
|
11
|
+
some: <R extends JsonValue>(value: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
12
|
+
none: <R extends JsonValue = string>() => KaladaV1Expression<R>;
|
|
13
|
+
}>;
|
|
14
|
+
Result: Readonly<{
|
|
15
|
+
ok: <R extends JsonValue>(value: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
16
|
+
err: <R extends JsonValue>(value: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
17
|
+
}>;
|
|
18
|
+
arm: <R extends JsonValue>(variant: MatchArm<R>["variant"], body: KaladaV1Expression<R>, name?: string) => MatchArm<R>;
|
|
19
|
+
match: <R extends JsonValue>(type: "Option" | "Result", value: KaladaV1Expression<R>, arms: readonly MatchArm<R>[]) => KaladaV1Expression<R>;
|
|
20
|
+
instant: <R extends JsonValue = string>(milliseconds: number) => KaladaV1Expression<R>;
|
|
21
|
+
duration: <R extends JsonValue = string>(milliseconds: number) => KaladaV1Expression<R>;
|
|
22
|
+
currentInstant: <R extends JsonValue = string>() => KaladaV1Expression<R>;
|
|
23
|
+
temporalArithmetic: <R extends JsonValue>(operator: "add" | "subtract", left: KaladaV1Expression<R>, right: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
24
|
+
temporalComparison: <R extends JsonValue>(operator: Extract<KaladaV1Expression<R>, {
|
|
25
|
+
kind: "temporal-comparison";
|
|
26
|
+
}>["operator"], left: KaladaV1Expression<R>, right: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
27
|
+
program<R extends JsonValue = string>(expression: KaladaV1Expression<R>): KaladaV1Program<R>;
|
|
28
|
+
}>;
|
|
29
|
+
|
|
30
|
+
export { KaladaV1 };
|