@kalada/core 0.3.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 (114) hide show
  1. package/README.md +62 -3
  2. package/dist/kalada-v1/canonical-input.cjs.map +1 -1
  3. package/dist/kalada-v1/canonical-input.d.cts +3 -2
  4. package/dist/kalada-v1/canonical-input.d.ts +3 -2
  5. package/dist/kalada-v1/canonical-input.js.map +1 -1
  6. package/dist/kalada-v1/canonicalize.cjs +16 -1
  7. package/dist/kalada-v1/canonicalize.cjs.map +1 -1
  8. package/dist/kalada-v1/canonicalize.js +16 -1
  9. package/dist/kalada-v1/canonicalize.js.map +1 -1
  10. package/dist/kalada-v1/compile.cjs +13 -4
  11. package/dist/kalada-v1/compile.cjs.map +1 -1
  12. package/dist/kalada-v1/compile.js +14 -5
  13. package/dist/kalada-v1/compile.js.map +1 -1
  14. package/dist/kalada-v1/dependencies.cjs +49 -2
  15. package/dist/kalada-v1/dependencies.cjs.map +1 -1
  16. package/dist/kalada-v1/dependencies.js +49 -2
  17. package/dist/kalada-v1/dependencies.js.map +1 -1
  18. package/dist/kalada-v1/diagnostics.cjs +24 -4
  19. package/dist/kalada-v1/diagnostics.cjs.map +1 -1
  20. package/dist/kalada-v1/diagnostics.d.cts +4 -3
  21. package/dist/kalada-v1/diagnostics.d.ts +4 -3
  22. package/dist/kalada-v1/diagnostics.js +24 -4
  23. package/dist/kalada-v1/diagnostics.js.map +1 -1
  24. package/dist/kalada-v1/evaluate.cjs +10 -139
  25. package/dist/kalada-v1/evaluate.cjs.map +1 -1
  26. package/dist/kalada-v1/evaluate.d.cts +3 -2
  27. package/dist/kalada-v1/evaluate.d.ts +3 -2
  28. package/dist/kalada-v1/evaluate.js +12 -141
  29. package/dist/kalada-v1/evaluate.js.map +1 -1
  30. package/dist/kalada-v1/evaluation-delivery.cjs +286 -0
  31. package/dist/kalada-v1/evaluation-delivery.cjs.map +1 -0
  32. package/dist/kalada-v1/evaluation-delivery.d.cts +13 -0
  33. package/dist/kalada-v1/evaluation-delivery.d.ts +13 -0
  34. package/dist/kalada-v1/evaluation-delivery.js +284 -0
  35. package/dist/kalada-v1/evaluation-delivery.js.map +1 -0
  36. package/dist/kalada-v1/evaluation-frames.cjs +16 -0
  37. package/dist/kalada-v1/evaluation-frames.cjs.map +1 -0
  38. package/dist/kalada-v1/evaluation-frames.d.cts +83 -0
  39. package/dist/kalada-v1/evaluation-frames.d.ts +83 -0
  40. package/dist/kalada-v1/evaluation-frames.js +14 -0
  41. package/dist/kalada-v1/evaluation-frames.js.map +1 -0
  42. package/dist/kalada-v1/evaluation-machine.cjs +226 -0
  43. package/dist/kalada-v1/evaluation-machine.cjs.map +1 -0
  44. package/dist/kalada-v1/evaluation-machine.d.cts +9 -0
  45. package/dist/kalada-v1/evaluation-machine.d.ts +9 -0
  46. package/dist/kalada-v1/evaluation-machine.js +224 -0
  47. package/dist/kalada-v1/evaluation-machine.js.map +1 -0
  48. package/dist/kalada-v1/evaluation-resolution.cjs +80 -0
  49. package/dist/kalada-v1/evaluation-resolution.cjs.map +1 -0
  50. package/dist/kalada-v1/evaluation-resolution.d.cts +11 -0
  51. package/dist/kalada-v1/evaluation-resolution.d.ts +11 -0
  52. package/dist/kalada-v1/evaluation-resolution.js +78 -0
  53. package/dist/kalada-v1/evaluation-resolution.js.map +1 -0
  54. package/dist/kalada-v1/evaluation-state.cjs +94 -0
  55. package/dist/kalada-v1/evaluation-state.cjs.map +1 -0
  56. package/dist/kalada-v1/evaluation-state.d.cts +38 -0
  57. package/dist/kalada-v1/evaluation-state.d.ts +38 -0
  58. package/dist/kalada-v1/evaluation-state.js +81 -0
  59. package/dist/kalada-v1/evaluation-state.js.map +1 -0
  60. package/dist/kalada-v1/factories.cjs +28 -0
  61. package/dist/kalada-v1/factories.cjs.map +1 -1
  62. package/dist/kalada-v1/factories.d.cts +16 -1
  63. package/dist/kalada-v1/factories.d.ts +16 -1
  64. package/dist/kalada-v1/factories.js +28 -0
  65. package/dist/kalada-v1/factories.js.map +1 -1
  66. package/dist/kalada-v1/function-contracts.cjs +150 -0
  67. package/dist/kalada-v1/function-contracts.cjs.map +1 -0
  68. package/dist/kalada-v1/function-contracts.d.cts +15 -0
  69. package/dist/kalada-v1/function-contracts.d.ts +15 -0
  70. package/dist/kalada-v1/function-contracts.js +144 -0
  71. package/dist/kalada-v1/function-contracts.js.map +1 -0
  72. package/dist/kalada-v1/index.cjs +13 -0
  73. package/dist/kalada-v1/index.d.cts +4 -3
  74. package/dist/kalada-v1/index.d.ts +4 -3
  75. package/dist/kalada-v1/index.js +3 -2
  76. package/dist/kalada-v1/limits.cjs +23 -2
  77. package/dist/kalada-v1/limits.cjs.map +1 -1
  78. package/dist/kalada-v1/limits.d.cts +5 -3
  79. package/dist/kalada-v1/limits.d.ts +5 -3
  80. package/dist/kalada-v1/limits.js +23 -3
  81. package/dist/kalada-v1/limits.js.map +1 -1
  82. package/dist/kalada-v1/runtime-values.cjs +112 -0
  83. package/dist/kalada-v1/runtime-values.cjs.map +1 -0
  84. package/dist/kalada-v1/runtime-values.d.cts +35 -0
  85. package/dist/kalada-v1/runtime-values.d.ts +35 -0
  86. package/dist/kalada-v1/runtime-values.js +105 -0
  87. package/dist/kalada-v1/runtime-values.js.map +1 -0
  88. package/dist/kalada-v1/schemas.cjs +107 -2
  89. package/dist/kalada-v1/schemas.cjs.map +1 -1
  90. package/dist/kalada-v1/schemas.d.cts +2 -1
  91. package/dist/kalada-v1/schemas.d.ts +2 -1
  92. package/dist/kalada-v1/schemas.js +108 -4
  93. package/dist/kalada-v1/schemas.js.map +1 -1
  94. package/dist/kalada-v1/static-analysis.cjs +177 -0
  95. package/dist/kalada-v1/static-analysis.cjs.map +1 -0
  96. package/dist/kalada-v1/static-analysis.d.cts +9 -0
  97. package/dist/kalada-v1/static-analysis.d.ts +9 -0
  98. package/dist/kalada-v1/static-analysis.js +175 -0
  99. package/dist/kalada-v1/static-analysis.js.map +1 -0
  100. package/dist/kalada-v1/static-types.cjs +229 -0
  101. package/dist/kalada-v1/static-types.cjs.map +1 -0
  102. package/dist/kalada-v1/static-types.d.cts +8 -0
  103. package/dist/kalada-v1/static-types.d.ts +8 -0
  104. package/dist/kalada-v1/static-types.js +227 -0
  105. package/dist/kalada-v1/static-types.js.map +1 -0
  106. package/dist/kalada-v1/temporal-evaluation.cjs +21 -0
  107. package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -1
  108. package/dist/kalada-v1/temporal-evaluation.d.cts +7 -2
  109. package/dist/kalada-v1/temporal-evaluation.d.ts +7 -2
  110. package/dist/kalada-v1/temporal-evaluation.js +20 -1
  111. package/dist/kalada-v1/temporal-evaluation.js.map +1 -1
  112. package/dist/kalada-v1/types.d.cts +78 -4
  113. package/dist/kalada-v1/types.d.ts +78 -4
  114. package/package.json +1 -1
@@ -1,45 +1,19 @@
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
6
  var temporal_js = require('./temporal.js');
7
- var temporalEvaluation_js = require('./temporal-evaluation.js');
8
- var values_js = require('./values.js');
9
7
 
10
- function evaluateKaladaV1(expression, resolve, limits, inputs = {}) {
8
+ function evaluateKaladaV1(expression, resolve, limits, functions, inputs = {}) {
11
9
  try {
12
10
  const instant = evaluationInstant(inputs);
13
- return diagnostics_js.success(
14
- evaluateNode(expression, ["expression"], /* @__PURE__ */ new Map(), { resolve, limits, instant, steps: 0 })
15
- );
11
+ return diagnostics_js.success(evaluationMachine_js.runEvaluation(expression, resolve, limits, functions, instant));
16
12
  } catch (error) {
17
13
  const problem = error instanceof diagnostics_js.KaladaFailure ? error : new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", []);
18
- return diagnostics_js.failure(problem.code, problem.path);
14
+ return diagnostics_js.failure(problem.code, problem.path, problem.context);
19
15
  }
20
16
  }
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
17
  function evaluationInstant(inputs) {
44
18
  let keys;
45
19
  try {
@@ -50,124 +24,21 @@ function evaluationInstant(inputs) {
50
24
  throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
51
25
  }
52
26
  const unexpected = keys.find((key) => key !== "instant");
53
- if (unexpected !== void 0)
27
+ if (unexpected !== void 0) {
54
28
  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
29
  }
30
+ if (!keys.includes("instant")) return void 0;
31
+ const instant = readInstant(inputs);
62
32
  if (instant !== void 0 && !temporal_js.isInstant(instant)) {
63
33
  throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
64
34
  }
65
35
  return instant;
66
36
  }
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;
37
+ function readInstant(inputs) {
103
38
  try {
104
- input = state.resolve(reference);
39
+ return json_js.dataValue(inputs, "instant");
105
40
  } 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);
41
+ throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
171
42
  }
172
43
  }
173
44
 
@@ -1 +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"]}
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,8 +1,9 @@
1
1
  import { JsonValue } from './json.cjs';
2
- import { KaladaV1Expression, KaladaV1Resolver, KaladaV1Limits, KaladaV1EvaluationInputs, 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';
4
5
  import './temporal.cjs';
5
6
 
6
- declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: KaladaV1Limits, inputs?: KaladaV1EvaluationInputs): KaladaV1Outcome<KaladaValue>;
7
+ declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: ResolvedKaladaV1Limits, functions: readonly KaladaV1FunctionCapture[], inputs?: KaladaV1EvaluationInputs): KaladaV1Outcome<KaladaValue>;
7
8
 
8
9
  export { evaluateKaladaV1 };
@@ -1,8 +1,9 @@
1
1
  import { JsonValue } from './json.js';
2
- import { KaladaV1Expression, KaladaV1Resolver, KaladaV1Limits, KaladaV1EvaluationInputs, 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';
4
5
  import './temporal.js';
5
6
 
6
- declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: KaladaV1Limits, inputs?: KaladaV1EvaluationInputs): KaladaV1Outcome<KaladaValue>;
7
+ declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: ResolvedKaladaV1Limits, functions: readonly KaladaV1FunctionCapture[], inputs?: KaladaV1EvaluationInputs): KaladaV1Outcome<KaladaValue>;
7
8
 
8
9
  export { evaluateKaladaV1 };
@@ -1,43 +1,17 @@
1
- import { rejectCallbackPromise } from '../kuery-v1/callback-promise.js';
2
1
  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';
2
+ import { runEvaluation } from './evaluation-machine.js';
3
+ import { dataValue } from './json.js';
4
+ import { isInstant } from './temporal.js';
7
5
 
8
- function evaluateKaladaV1(expression, resolve, limits, inputs = {}) {
6
+ function evaluateKaladaV1(expression, resolve, limits, functions, inputs = {}) {
9
7
  try {
10
8
  const instant = evaluationInstant(inputs);
11
- return success(
12
- evaluateNode(expression, ["expression"], /* @__PURE__ */ new Map(), { resolve, limits, instant, steps: 0 })
13
- );
9
+ return success(runEvaluation(expression, resolve, limits, functions, instant));
14
10
  } catch (error) {
15
11
  const problem = error instanceof KaladaFailure ? error : new KaladaFailure("KALADA_REFERENCE_ERROR", []);
16
- return failure(problem.code, problem.path);
12
+ return failure(problem.code, problem.path, problem.context);
17
13
  }
18
14
  }
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
15
  function evaluationInstant(inputs) {
42
16
  let keys;
43
17
  try {
@@ -48,124 +22,21 @@ function evaluationInstant(inputs) {
48
22
  throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
49
23
  }
50
24
  const unexpected = keys.find((key) => key !== "instant");
51
- if (unexpected !== void 0)
25
+ if (unexpected !== void 0) {
52
26
  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
27
  }
28
+ if (!keys.includes("instant")) return void 0;
29
+ const instant = readInstant(inputs);
60
30
  if (instant !== void 0 && !isInstant(instant)) {
61
31
  throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
62
32
  }
63
33
  return instant;
64
34
  }
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;
35
+ function readInstant(inputs) {
101
36
  try {
102
- input = state.resolve(reference);
37
+ return dataValue(inputs, "instant");
103
38
  } 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);
39
+ throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
169
40
  }
170
41
  }
171
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 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"]}
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"]}