@kalada/core 0.2.0 → 0.4.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.
Files changed (140) hide show
  1. package/README.md +62 -3
  2. package/dist/kalada-v1/canonical-input.cjs +133 -0
  3. package/dist/kalada-v1/canonical-input.cjs.map +1 -0
  4. package/dist/kalada-v1/canonical-input.d.cts +26 -0
  5. package/dist/kalada-v1/canonical-input.d.ts +26 -0
  6. package/dist/kalada-v1/canonical-input.js +122 -0
  7. package/dist/kalada-v1/canonical-input.js.map +1 -0
  8. package/dist/kalada-v1/canonicalize.cjs +93 -130
  9. package/dist/kalada-v1/canonicalize.cjs.map +1 -1
  10. package/dist/kalada-v1/canonicalize.d.cts +1 -0
  11. package/dist/kalada-v1/canonicalize.d.ts +1 -0
  12. package/dist/kalada-v1/canonicalize.js +71 -108
  13. package/dist/kalada-v1/canonicalize.js.map +1 -1
  14. package/dist/kalada-v1/codec.cjs +24 -0
  15. package/dist/kalada-v1/codec.cjs.map +1 -1
  16. package/dist/kalada-v1/codec.d.cts +5 -0
  17. package/dist/kalada-v1/codec.d.ts +5 -0
  18. package/dist/kalada-v1/codec.js +24 -0
  19. package/dist/kalada-v1/codec.js.map +1 -1
  20. package/dist/kalada-v1/compile.cjs +24 -1
  21. package/dist/kalada-v1/compile.cjs.map +1 -1
  22. package/dist/kalada-v1/compile.d.cts +1 -0
  23. package/dist/kalada-v1/compile.d.ts +1 -0
  24. package/dist/kalada-v1/compile.js +25 -2
  25. package/dist/kalada-v1/compile.js.map +1 -1
  26. package/dist/kalada-v1/dependencies.cjs +55 -2
  27. package/dist/kalada-v1/dependencies.cjs.map +1 -1
  28. package/dist/kalada-v1/dependencies.d.cts +1 -0
  29. package/dist/kalada-v1/dependencies.d.ts +1 -0
  30. package/dist/kalada-v1/dependencies.js +55 -2
  31. package/dist/kalada-v1/dependencies.js.map +1 -1
  32. package/dist/kalada-v1/diagnostics.cjs +29 -4
  33. package/dist/kalada-v1/diagnostics.cjs.map +1 -1
  34. package/dist/kalada-v1/diagnostics.d.cts +5 -3
  35. package/dist/kalada-v1/diagnostics.d.ts +5 -3
  36. package/dist/kalada-v1/diagnostics.js +29 -4
  37. package/dist/kalada-v1/diagnostics.js.map +1 -1
  38. package/dist/kalada-v1/evaluate.cjs +23 -117
  39. package/dist/kalada-v1/evaluate.cjs.map +1 -1
  40. package/dist/kalada-v1/evaluate.d.cts +4 -2
  41. package/dist/kalada-v1/evaluate.d.ts +4 -2
  42. package/dist/kalada-v1/evaluate.js +24 -118
  43. package/dist/kalada-v1/evaluate.js.map +1 -1
  44. package/dist/kalada-v1/evaluation-delivery.cjs +286 -0
  45. package/dist/kalada-v1/evaluation-delivery.cjs.map +1 -0
  46. package/dist/kalada-v1/evaluation-delivery.d.cts +13 -0
  47. package/dist/kalada-v1/evaluation-delivery.d.ts +13 -0
  48. package/dist/kalada-v1/evaluation-delivery.js +284 -0
  49. package/dist/kalada-v1/evaluation-delivery.js.map +1 -0
  50. package/dist/kalada-v1/evaluation-frames.cjs +16 -0
  51. package/dist/kalada-v1/evaluation-frames.cjs.map +1 -0
  52. package/dist/kalada-v1/evaluation-frames.d.cts +83 -0
  53. package/dist/kalada-v1/evaluation-frames.d.ts +83 -0
  54. package/dist/kalada-v1/evaluation-frames.js +14 -0
  55. package/dist/kalada-v1/evaluation-frames.js.map +1 -0
  56. package/dist/kalada-v1/evaluation-machine.cjs +226 -0
  57. package/dist/kalada-v1/evaluation-machine.cjs.map +1 -0
  58. package/dist/kalada-v1/evaluation-machine.d.cts +9 -0
  59. package/dist/kalada-v1/evaluation-machine.d.ts +9 -0
  60. package/dist/kalada-v1/evaluation-machine.js +224 -0
  61. package/dist/kalada-v1/evaluation-machine.js.map +1 -0
  62. package/dist/kalada-v1/evaluation-resolution.cjs +80 -0
  63. package/dist/kalada-v1/evaluation-resolution.cjs.map +1 -0
  64. package/dist/kalada-v1/evaluation-resolution.d.cts +11 -0
  65. package/dist/kalada-v1/evaluation-resolution.d.ts +11 -0
  66. package/dist/kalada-v1/evaluation-resolution.js +78 -0
  67. package/dist/kalada-v1/evaluation-resolution.js.map +1 -0
  68. package/dist/kalada-v1/evaluation-state.cjs +94 -0
  69. package/dist/kalada-v1/evaluation-state.cjs.map +1 -0
  70. package/dist/kalada-v1/evaluation-state.d.cts +38 -0
  71. package/dist/kalada-v1/evaluation-state.d.ts +38 -0
  72. package/dist/kalada-v1/evaluation-state.js +81 -0
  73. package/dist/kalada-v1/evaluation-state.js.map +1 -0
  74. package/dist/kalada-v1/factories.cjs +46 -0
  75. package/dist/kalada-v1/factories.cjs.map +1 -1
  76. package/dist/kalada-v1/factories.d.cts +24 -1
  77. package/dist/kalada-v1/factories.d.ts +24 -1
  78. package/dist/kalada-v1/factories.js +46 -0
  79. package/dist/kalada-v1/factories.js.map +1 -1
  80. package/dist/kalada-v1/function-contracts.cjs +150 -0
  81. package/dist/kalada-v1/function-contracts.cjs.map +1 -0
  82. package/dist/kalada-v1/function-contracts.d.cts +15 -0
  83. package/dist/kalada-v1/function-contracts.d.ts +15 -0
  84. package/dist/kalada-v1/function-contracts.js +144 -0
  85. package/dist/kalada-v1/function-contracts.js.map +1 -0
  86. package/dist/kalada-v1/index.cjs +30 -0
  87. package/dist/kalada-v1/index.d.cts +5 -3
  88. package/dist/kalada-v1/index.d.ts +5 -3
  89. package/dist/kalada-v1/index.js +4 -2
  90. package/dist/kalada-v1/limits.cjs +23 -2
  91. package/dist/kalada-v1/limits.cjs.map +1 -1
  92. package/dist/kalada-v1/limits.d.cts +6 -3
  93. package/dist/kalada-v1/limits.d.ts +6 -3
  94. package/dist/kalada-v1/limits.js +23 -3
  95. package/dist/kalada-v1/limits.js.map +1 -1
  96. package/dist/kalada-v1/runtime-values.cjs +112 -0
  97. package/dist/kalada-v1/runtime-values.cjs.map +1 -0
  98. package/dist/kalada-v1/runtime-values.d.cts +35 -0
  99. package/dist/kalada-v1/runtime-values.d.ts +35 -0
  100. package/dist/kalada-v1/runtime-values.js +105 -0
  101. package/dist/kalada-v1/runtime-values.js.map +1 -0
  102. package/dist/kalada-v1/schemas.cjs +136 -3
  103. package/dist/kalada-v1/schemas.cjs.map +1 -1
  104. package/dist/kalada-v1/schemas.d.cts +2 -1
  105. package/dist/kalada-v1/schemas.d.ts +2 -1
  106. package/dist/kalada-v1/schemas.js +137 -5
  107. package/dist/kalada-v1/schemas.js.map +1 -1
  108. package/dist/kalada-v1/static-analysis.cjs +177 -0
  109. package/dist/kalada-v1/static-analysis.cjs.map +1 -0
  110. package/dist/kalada-v1/static-analysis.d.cts +9 -0
  111. package/dist/kalada-v1/static-analysis.d.ts +9 -0
  112. package/dist/kalada-v1/static-analysis.js +175 -0
  113. package/dist/kalada-v1/static-analysis.js.map +1 -0
  114. package/dist/kalada-v1/static-types.cjs +229 -0
  115. package/dist/kalada-v1/static-types.cjs.map +1 -0
  116. package/dist/kalada-v1/static-types.d.cts +8 -0
  117. package/dist/kalada-v1/static-types.d.ts +8 -0
  118. package/dist/kalada-v1/static-types.js +227 -0
  119. package/dist/kalada-v1/static-types.js.map +1 -0
  120. package/dist/kalada-v1/temporal-evaluation.cjs +95 -0
  121. package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -0
  122. package/dist/kalada-v1/temporal-evaluation.d.cts +18 -0
  123. package/dist/kalada-v1/temporal-evaluation.d.ts +18 -0
  124. package/dist/kalada-v1/temporal-evaluation.js +90 -0
  125. package/dist/kalada-v1/temporal-evaluation.js.map +1 -0
  126. package/dist/kalada-v1/temporal.cjs +42 -0
  127. package/dist/kalada-v1/temporal.cjs.map +1 -0
  128. package/dist/kalada-v1/temporal.d.cts +22 -0
  129. package/dist/kalada-v1/temporal.d.ts +22 -0
  130. package/dist/kalada-v1/temporal.js +37 -0
  131. package/dist/kalada-v1/temporal.js.map +1 -0
  132. package/dist/kalada-v1/types.d.cts +108 -5
  133. package/dist/kalada-v1/types.d.ts +108 -5
  134. package/dist/kalada-v1/values.cjs +13 -1
  135. package/dist/kalada-v1/values.cjs.map +1 -1
  136. package/dist/kalada-v1/values.d.cts +2 -1
  137. package/dist/kalada-v1/values.d.ts +2 -1
  138. package/dist/kalada-v1/values.js +13 -1
  139. package/dist/kalada-v1/values.js.map +1 -1
  140. package/package.json +1 -1
@@ -1,138 +1,44 @@
1
1
  'use strict';
2
2
 
3
- var callbackPromise_js = require('../kuery-v1/callback-promise.js');
4
3
  var diagnostics_js = require('./diagnostics.js');
4
+ var evaluationMachine_js = require('./evaluation-machine.js');
5
5
  var json_js = require('./json.js');
6
- var values_js = require('./values.js');
6
+ var temporal_js = require('./temporal.js');
7
7
 
8
- function evaluateKaladaV1(expression, resolve, limits) {
8
+ function evaluateKaladaV1(expression, resolve, limits, functions, inputs = {}) {
9
9
  try {
10
- return diagnostics_js.success(
11
- evaluateNode(expression, ["expression"], /* @__PURE__ */ new Map(), { resolve, limits, steps: 0 })
12
- );
10
+ const instant = evaluationInstant(inputs);
11
+ return diagnostics_js.success(evaluationMachine_js.runEvaluation(expression, resolve, limits, functions, instant));
13
12
  } catch (error) {
14
13
  const problem = error instanceof diagnostics_js.KaladaFailure ? error : new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", []);
15
- return diagnostics_js.failure(problem.code, problem.path);
14
+ return diagnostics_js.failure(problem.code, problem.path, problem.context);
16
15
  }
17
16
  }
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;
17
+ function evaluationInstant(inputs) {
18
+ let keys;
68
19
  try {
69
- input = state.resolve(reference);
20
+ if (typeof inputs !== "object" || inputs === null || Array.isArray(inputs))
21
+ throw new TypeError();
22
+ keys = Reflect.ownKeys(inputs);
70
23
  } 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);
24
+ throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
79
25
  }
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);
26
+ const unexpected = keys.find((key) => key !== "instant");
27
+ if (unexpected !== void 0) {
28
+ throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", String(unexpected)]);
116
29
  }
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);
30
+ if (!keys.includes("instant")) return void 0;
31
+ const instant = readInstant(inputs);
32
+ if (instant !== void 0 && !temporal_js.isInstant(instant)) {
33
+ throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
123
34
  }
35
+ return instant;
124
36
  }
125
- function safeData(input, key, path) {
37
+ function readInstant(inputs) {
126
38
  try {
127
- return json_js.dataValue(input, key);
39
+ return json_js.dataValue(inputs, "instant");
128
40
  } 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);
41
+ throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
136
42
  }
137
43
  }
138
44
 
@@ -1 +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"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/evaluate.ts"],"names":["success","runEvaluation","KaladaFailure","failure","isInstant","dataValue"],"mappings":";;;;;;;AAeO,SAAS,iBACd,UAAA,EACA,OAAA,EACA,QACA,SAAA,EACA,MAAA,GAAmC,EAAC,EACN;AAC9B,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,kBAAkB,MAAM,CAAA;AACxC,IAAA,OAAOA,uBAAQC,kCAAA,CAAc,UAAA,EAAY,SAAS,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,EAC/E,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GACJ,iBAAiBC,4BAAA,GAAgB,KAAA,GAAQ,IAAIA,4BAAA,CAAc,wBAAA,EAA0B,EAAE,CAAA;AACzF,IAAA,OAAOC,uBAAQ,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,QAAQ,OAAO,CAAA;AAAA,EAC5D;AACF;AAEA,SAAS,kBAAkB,MAAA,EAA4D;AACrF,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,WAAW,IAAA,IAAQ,KAAA,CAAM,QAAQ,MAAM,CAAA;AACvE,MAAA,MAAM,IAAI,SAAA,EAAU;AACtB,IAAA,IAAA,GAAO,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAAA,EAC/B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAID,4BAAA,CAAc,sBAAA,EAAwB,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,MAAM,aAAa,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,QAAQ,SAAS,CAAA;AACvD,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,MAAM,IAAIA,6BAAc,sBAAA,EAAwB,CAAC,UAAU,MAAA,CAAO,UAAU,CAAC,CAAC,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,SAAS,GAAG,OAAO,MAAA;AACtC,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM,CAAA;AAClC,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,CAACE,qBAAA,CAAU,OAAO,CAAA,EAAG;AAChD,IAAA,MAAM,IAAIF,4BAAA,CAAc,sBAAA,EAAwB,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,YAAY,MAAA,EAA2C;AAC9D,EAAA,IAAI;AACF,IAAA,OAAOG,iBAAA,CAAU,QAAQ,SAAS,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIH,4BAAA,CAAc,sBAAA,EAAwB,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,EACvE;AACF","file":"evaluate.cjs","sourcesContent":["import { failure, KaladaFailure, success } from \"./diagnostics.js\";\nimport { runEvaluation } from \"./evaluation-machine.js\";\nimport type { JsonValue } from \"./json.js\";\nimport { dataValue } from \"./json.js\";\nimport type { ResolvedKaladaV1Limits } from \"./limits.js\";\nimport { type InstantValue, isInstant } from \"./temporal.js\";\nimport type {\n KaladaV1EvaluationInputs,\n KaladaV1Expression,\n KaladaV1FunctionCapture,\n KaladaV1Outcome,\n KaladaV1Resolver,\n} from \"./types.js\";\nimport type { KaladaValue } from \"./values.js\";\n\nexport function evaluateKaladaV1<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n resolve: KaladaV1Resolver<R>,\n limits: ResolvedKaladaV1Limits,\n functions: readonly KaladaV1FunctionCapture[],\n inputs: KaladaV1EvaluationInputs = {},\n): KaladaV1Outcome<KaladaValue> {\n try {\n const instant = evaluationInstant(inputs);\n return success(runEvaluation(expression, resolve, limits, functions, instant));\n } catch (error) {\n const problem =\n error instanceof KaladaFailure ? error : new KaladaFailure(\"KALADA_REFERENCE_ERROR\", []);\n return failure(problem.code, problem.path, problem.context);\n }\n}\n\nfunction evaluationInstant(inputs: KaladaV1EvaluationInputs): InstantValue | undefined {\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 }\n if (!keys.includes(\"instant\")) return undefined;\n const instant = readInstant(inputs);\n if (instant !== undefined && !isInstant(instant)) {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", \"instant\"]);\n }\n return instant;\n}\n\nfunction readInstant(inputs: KaladaV1EvaluationInputs): unknown {\n try {\n return dataValue(inputs, \"instant\");\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", \"instant\"]);\n }\n}\n"]}
@@ -1,7 +1,9 @@
1
1
  import { JsonValue } from './json.cjs';
2
- import { KaladaV1Expression, KaladaV1Resolver, KaladaV1Limits, KaladaV1Outcome } from './types.cjs';
2
+ import { ResolvedKaladaV1Limits } from './limits.cjs';
3
+ import { KaladaV1Expression, KaladaV1Resolver, KaladaV1FunctionCapture, KaladaV1EvaluationInputs, KaladaV1Outcome } from './types.cjs';
3
4
  import { KaladaValue } from './values.cjs';
5
+ import './temporal.cjs';
4
6
 
5
- declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: KaladaV1Limits): KaladaV1Outcome<KaladaValue>;
7
+ declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: ResolvedKaladaV1Limits, functions: readonly KaladaV1FunctionCapture[], inputs?: KaladaV1EvaluationInputs): KaladaV1Outcome<KaladaValue>;
6
8
 
7
9
  export { evaluateKaladaV1 };
@@ -1,7 +1,9 @@
1
1
  import { JsonValue } from './json.js';
2
- import { KaladaV1Expression, KaladaV1Resolver, KaladaV1Limits, KaladaV1Outcome } from './types.js';
2
+ import { ResolvedKaladaV1Limits } from './limits.js';
3
+ import { KaladaV1Expression, KaladaV1Resolver, KaladaV1FunctionCapture, KaladaV1EvaluationInputs, KaladaV1Outcome } from './types.js';
3
4
  import { KaladaValue } from './values.js';
5
+ import './temporal.js';
4
6
 
5
- declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: KaladaV1Limits): KaladaV1Outcome<KaladaValue>;
7
+ declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: ResolvedKaladaV1Limits, functions: readonly KaladaV1FunctionCapture[], inputs?: KaladaV1EvaluationInputs): KaladaV1Outcome<KaladaValue>;
6
8
 
7
9
  export { evaluateKaladaV1 };
@@ -1,136 +1,42 @@
1
- import { rejectCallbackPromise } from '../kuery-v1/callback-promise.js';
2
1
  import { success, KaladaFailure, failure } from './diagnostics.js';
3
- import { cloneJson, dataValue } from './json.js';
4
- import { Option, Result, isOption, isResult, validateKaladaValueLimits } from './values.js';
2
+ import { runEvaluation } from './evaluation-machine.js';
3
+ import { dataValue } from './json.js';
4
+ import { isInstant } from './temporal.js';
5
5
 
6
- function evaluateKaladaV1(expression, resolve, limits) {
6
+ function evaluateKaladaV1(expression, resolve, limits, functions, inputs = {}) {
7
7
  try {
8
- return success(
9
- evaluateNode(expression, ["expression"], /* @__PURE__ */ new Map(), { resolve, limits, steps: 0 })
10
- );
8
+ const instant = evaluationInstant(inputs);
9
+ return success(runEvaluation(expression, resolve, limits, functions, instant));
11
10
  } catch (error) {
12
11
  const problem = error instanceof KaladaFailure ? error : new KaladaFailure("KALADA_REFERENCE_ERROR", []);
13
- return failure(problem.code, problem.path);
12
+ return failure(problem.code, problem.path, problem.context);
14
13
  }
15
14
  }
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;
15
+ function evaluationInstant(inputs) {
16
+ let keys;
66
17
  try {
67
- input = state.resolve(reference);
18
+ if (typeof inputs !== "object" || inputs === null || Array.isArray(inputs))
19
+ throw new TypeError();
20
+ keys = Reflect.ownKeys(inputs);
68
21
  } 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);
22
+ throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
77
23
  }
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);
24
+ const unexpected = keys.find((key) => key !== "instant");
25
+ if (unexpected !== void 0) {
26
+ throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", String(unexpected)]);
114
27
  }
115
- }
116
- function safeKeys(input, path) {
117
- try {
118
- return Reflect.ownKeys(input);
119
- } catch {
120
- throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
28
+ if (!keys.includes("instant")) return void 0;
29
+ const instant = readInstant(inputs);
30
+ if (instant !== void 0 && !isInstant(instant)) {
31
+ throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
121
32
  }
33
+ return instant;
122
34
  }
123
- function safeData(input, key, path) {
35
+ function readInstant(inputs) {
124
36
  try {
125
- return dataValue(input, key);
37
+ return dataValue(inputs, "instant");
126
38
  } 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);
39
+ throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
134
40
  }
135
41
  }
136
42
 
@@ -1 +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"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/evaluate.ts"],"names":[],"mappings":";;;;;AAeO,SAAS,iBACd,UAAA,EACA,OAAA,EACA,QACA,SAAA,EACA,MAAA,GAAmC,EAAC,EACN;AAC9B,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,kBAAkB,MAAM,CAAA;AACxC,IAAA,OAAO,QAAQ,aAAA,CAAc,UAAA,EAAY,SAAS,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,EAC/E,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GACJ,iBAAiB,aAAA,GAAgB,KAAA,GAAQ,IAAI,aAAA,CAAc,wBAAA,EAA0B,EAAE,CAAA;AACzF,IAAA,OAAO,QAAQ,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,QAAQ,OAAO,CAAA;AAAA,EAC5D;AACF;AAEA,SAAS,kBAAkB,MAAA,EAA4D;AACrF,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,WAAW,IAAA,IAAQ,KAAA,CAAM,QAAQ,MAAM,CAAA;AACvE,MAAA,MAAM,IAAI,SAAA,EAAU;AACtB,IAAA,IAAA,GAAO,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAAA,EAC/B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,aAAA,CAAc,sBAAA,EAAwB,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,MAAM,aAAa,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,QAAQ,SAAS,CAAA;AACvD,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,MAAM,IAAI,cAAc,sBAAA,EAAwB,CAAC,UAAU,MAAA,CAAO,UAAU,CAAC,CAAC,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,SAAS,GAAG,OAAO,MAAA;AACtC,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM,CAAA;AAClC,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,CAAC,SAAA,CAAU,OAAO,CAAA,EAAG;AAChD,IAAA,MAAM,IAAI,aAAA,CAAc,sBAAA,EAAwB,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,YAAY,MAAA,EAA2C;AAC9D,EAAA,IAAI;AACF,IAAA,OAAO,SAAA,CAAU,QAAQ,SAAS,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,aAAA,CAAc,sBAAA,EAAwB,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,EACvE;AACF","file":"evaluate.js","sourcesContent":["import { failure, KaladaFailure, success } from \"./diagnostics.js\";\nimport { runEvaluation } from \"./evaluation-machine.js\";\nimport type { JsonValue } from \"./json.js\";\nimport { dataValue } from \"./json.js\";\nimport type { ResolvedKaladaV1Limits } from \"./limits.js\";\nimport { type InstantValue, isInstant } from \"./temporal.js\";\nimport type {\n KaladaV1EvaluationInputs,\n KaladaV1Expression,\n KaladaV1FunctionCapture,\n KaladaV1Outcome,\n KaladaV1Resolver,\n} from \"./types.js\";\nimport type { KaladaValue } from \"./values.js\";\n\nexport function evaluateKaladaV1<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n resolve: KaladaV1Resolver<R>,\n limits: ResolvedKaladaV1Limits,\n functions: readonly KaladaV1FunctionCapture[],\n inputs: KaladaV1EvaluationInputs = {},\n): KaladaV1Outcome<KaladaValue> {\n try {\n const instant = evaluationInstant(inputs);\n return success(runEvaluation(expression, resolve, limits, functions, instant));\n } catch (error) {\n const problem =\n error instanceof KaladaFailure ? error : new KaladaFailure(\"KALADA_REFERENCE_ERROR\", []);\n return failure(problem.code, problem.path, problem.context);\n }\n}\n\nfunction evaluationInstant(inputs: KaladaV1EvaluationInputs): InstantValue | undefined {\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 }\n if (!keys.includes(\"instant\")) return undefined;\n const instant = readInstant(inputs);\n if (instant !== undefined && !isInstant(instant)) {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", \"instant\"]);\n }\n return instant;\n}\n\nfunction readInstant(inputs: KaladaV1EvaluationInputs): unknown {\n try {\n return dataValue(inputs, \"instant\");\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", \"instant\"]);\n }\n}\n"]}