@kalada/core 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/kalada-v1/canonical-input.cjs +133 -0
  2. package/dist/kalada-v1/canonical-input.cjs.map +1 -0
  3. package/dist/kalada-v1/canonical-input.d.cts +25 -0
  4. package/dist/kalada-v1/canonical-input.d.ts +25 -0
  5. package/dist/kalada-v1/canonical-input.js +122 -0
  6. package/dist/kalada-v1/canonical-input.js.map +1 -0
  7. package/dist/kalada-v1/canonicalize.cjs +78 -130
  8. package/dist/kalada-v1/canonicalize.cjs.map +1 -1
  9. package/dist/kalada-v1/canonicalize.d.cts +1 -0
  10. package/dist/kalada-v1/canonicalize.d.ts +1 -0
  11. package/dist/kalada-v1/canonicalize.js +56 -108
  12. package/dist/kalada-v1/canonicalize.js.map +1 -1
  13. package/dist/kalada-v1/codec.cjs +24 -0
  14. package/dist/kalada-v1/codec.cjs.map +1 -1
  15. package/dist/kalada-v1/codec.d.cts +5 -0
  16. package/dist/kalada-v1/codec.d.ts +5 -0
  17. package/dist/kalada-v1/codec.js +24 -0
  18. package/dist/kalada-v1/codec.js.map +1 -1
  19. package/dist/kalada-v1/compile.cjs +15 -1
  20. package/dist/kalada-v1/compile.cjs.map +1 -1
  21. package/dist/kalada-v1/compile.d.cts +1 -0
  22. package/dist/kalada-v1/compile.d.ts +1 -0
  23. package/dist/kalada-v1/compile.js +15 -1
  24. package/dist/kalada-v1/compile.js.map +1 -1
  25. package/dist/kalada-v1/dependencies.cjs +7 -1
  26. package/dist/kalada-v1/dependencies.cjs.map +1 -1
  27. package/dist/kalada-v1/dependencies.d.cts +1 -0
  28. package/dist/kalada-v1/dependencies.d.ts +1 -0
  29. package/dist/kalada-v1/dependencies.js +7 -1
  30. package/dist/kalada-v1/dependencies.js.map +1 -1
  31. package/dist/kalada-v1/diagnostics.cjs +6 -1
  32. package/dist/kalada-v1/diagnostics.cjs.map +1 -1
  33. package/dist/kalada-v1/diagnostics.d.cts +1 -0
  34. package/dist/kalada-v1/diagnostics.d.ts +1 -0
  35. package/dist/kalada-v1/diagnostics.js +6 -1
  36. package/dist/kalada-v1/diagnostics.js.map +1 -1
  37. package/dist/kalada-v1/evaluate.cjs +38 -3
  38. package/dist/kalada-v1/evaluate.cjs.map +1 -1
  39. package/dist/kalada-v1/evaluate.d.cts +3 -2
  40. package/dist/kalada-v1/evaluate.d.ts +3 -2
  41. package/dist/kalada-v1/evaluate.js +39 -4
  42. package/dist/kalada-v1/evaluate.js.map +1 -1
  43. package/dist/kalada-v1/factories.cjs +18 -0
  44. package/dist/kalada-v1/factories.cjs.map +1 -1
  45. package/dist/kalada-v1/factories.d.cts +8 -0
  46. package/dist/kalada-v1/factories.d.ts +8 -0
  47. package/dist/kalada-v1/factories.js +18 -0
  48. package/dist/kalada-v1/factories.js.map +1 -1
  49. package/dist/kalada-v1/index.cjs +17 -0
  50. package/dist/kalada-v1/index.d.cts +2 -1
  51. package/dist/kalada-v1/index.d.ts +2 -1
  52. package/dist/kalada-v1/index.js +1 -0
  53. package/dist/kalada-v1/limits.d.cts +1 -0
  54. package/dist/kalada-v1/limits.d.ts +1 -0
  55. package/dist/kalada-v1/schemas.cjs +29 -1
  56. package/dist/kalada-v1/schemas.cjs.map +1 -1
  57. package/dist/kalada-v1/schemas.js +29 -1
  58. package/dist/kalada-v1/schemas.js.map +1 -1
  59. package/dist/kalada-v1/temporal-evaluation.cjs +74 -0
  60. package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -0
  61. package/dist/kalada-v1/temporal-evaluation.d.cts +13 -0
  62. package/dist/kalada-v1/temporal-evaluation.d.ts +13 -0
  63. package/dist/kalada-v1/temporal-evaluation.js +71 -0
  64. package/dist/kalada-v1/temporal-evaluation.js.map +1 -0
  65. package/dist/kalada-v1/temporal.cjs +42 -0
  66. package/dist/kalada-v1/temporal.cjs.map +1 -0
  67. package/dist/kalada-v1/temporal.d.cts +22 -0
  68. package/dist/kalada-v1/temporal.d.ts +22 -0
  69. package/dist/kalada-v1/temporal.js +37 -0
  70. package/dist/kalada-v1/temporal.js.map +1 -0
  71. package/dist/kalada-v1/types.d.cts +33 -4
  72. package/dist/kalada-v1/types.d.ts +33 -4
  73. package/dist/kalada-v1/values.cjs +13 -1
  74. package/dist/kalada-v1/values.cjs.map +1 -1
  75. package/dist/kalada-v1/values.d.cts +2 -1
  76. package/dist/kalada-v1/values.d.ts +2 -1
  77. package/dist/kalada-v1/values.js +13 -1
  78. package/dist/kalada-v1/values.js.map +1 -1
  79. package/package.json +1 -1
@@ -1,5 +1,6 @@
1
1
  import { cloneJsonWithStats, dataValue, cloneJson } from './json.js';
2
2
  import { DEFAULT_KALADA_V1_LIMITS } from './limits.js';
3
+ import { isInstant, isDuration, Instant, Duration } from './temporal.js';
3
4
  import { isOption, isResult, Option, Result } from './values.js';
4
5
 
5
6
  const INVALID = "Invalid kalada-value v1 envelope.";
@@ -23,6 +24,10 @@ function encodeKaladaValue(value) {
23
24
  frames.push({ type: current.type, variant: current.variant });
24
25
  current = current.value;
25
26
  }
27
+ if (isInstant(current) || isDuration(current)) {
28
+ charge(nodes, frames.length);
29
+ return wrapFrames(frozenTemporal(current.type, current.milliseconds), frames);
30
+ }
26
31
  const remaining = LIMITS.maxNodes - charge(nodes, frames.length);
27
32
  const json = cloneJsonWithStats(current, {
28
33
  ...LIMITS,
@@ -42,6 +47,8 @@ function decodeKaladaValue(input) {
42
47
  if (active.has(envelope)) throw new TypeError(INVALID);
43
48
  active.add(envelope);
44
49
  const fields = envelopeFields(envelope);
50
+ const temporal = decodeTemporal(envelope, fields);
51
+ if (temporal) return wrapValues(temporal, frames);
45
52
  if (fields.type === "Json" && fields.variant === "value") {
46
53
  assertKeys(envelope, ["format", "version", "type", "variant", "value"]);
47
54
  const value = decodeJson(dataValue(envelope, "value"), nodes, frames.length);
@@ -56,6 +63,14 @@ function decodeKaladaValue(input) {
56
63
  current = dataValue(envelope, "value");
57
64
  }
58
65
  }
66
+ function decodeTemporal(envelope, fields) {
67
+ if (fields.type !== "Instant" && fields.type !== "Duration") return void 0;
68
+ if (fields.variant !== "milliseconds") throw new TypeError(INVALID);
69
+ assertKeys(envelope, ["format", "version", "type", "variant", "value"]);
70
+ const value = dataValue(envelope, "value");
71
+ if (typeof value !== "number" || !Number.isSafeInteger(value)) throw new TypeError(INVALID);
72
+ return fields.type === "Instant" ? Instant.fromMilliseconds(value) : Duration.fromMilliseconds(value);
73
+ }
59
74
  function decodeJson(input, nodes, depth) {
60
75
  return cloneJson(input, {
61
76
  ...LIMITS,
@@ -140,6 +155,15 @@ function frozenJson(value) {
140
155
  value
141
156
  });
142
157
  }
158
+ function frozenTemporal(type, value) {
159
+ return Object.freeze({
160
+ format: "kalada-value",
161
+ version: 1,
162
+ type,
163
+ variant: "milliseconds",
164
+ value
165
+ });
166
+ }
143
167
 
144
168
  export { decodeKaladaValue, encodeKaladaValue };
145
169
  //# sourceMappingURL=codec.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/codec.ts"],"names":[],"mappings":"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","file":"codec.js","sourcesContent":["import { cloneJson, cloneJsonWithStats, dataValue, type JsonValue } from \"./json.js\";\nimport { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\nimport { isOption, isResult, type KaladaValue, Option, Result } from \"./values.js\";\n\ninterface EncodedHeader {\n readonly format: \"kalada-value\";\n readonly version: 1;\n}\n\nexport type EncodedKaladaValueV1 =\n | (EncodedHeader & {\n readonly type: \"Json\";\n readonly variant: \"value\";\n readonly value: JsonValue;\n })\n | (EncodedHeader & { readonly type: \"Option\"; readonly variant: \"none\" })\n | (EncodedHeader & {\n readonly type: \"Option\";\n readonly variant: \"some\";\n readonly value: EncodedKaladaValueV1;\n })\n | (EncodedHeader & {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n readonly value: EncodedKaladaValueV1;\n });\n\ntype Frame =\n | { readonly type: \"Option\"; readonly variant: \"some\" }\n | {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n };\n\nconst INVALID = \"Invalid kalada-value v1 envelope.\";\nconst LIMITS = Object.freeze({\n maxDepth: DEFAULT_KALADA_V1_LIMITS.maxValueDepth,\n maxNodes: DEFAULT_KALADA_V1_LIMITS.maxValueNodes,\n maxStringLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength,\n});\n\nexport function encodeKaladaValue(value: KaladaValue): EncodedKaladaValueV1 {\n const frames: Frame[] = [];\n const seen = new WeakSet<object>();\n let current = value;\n let nodes = 0;\n while (isOption(current) || isResult(current)) {\n nodes = charge(nodes, frames.length);\n if (seen.has(current)) throw new TypeError(INVALID);\n seen.add(current);\n if (isOption(current) && current.variant === \"none\") {\n return wrapFrames(frozenNone(), frames);\n }\n frames.push({ type: current.type, variant: current.variant } as Frame);\n current = current.value;\n }\n const remaining = LIMITS.maxNodes - charge(nodes, frames.length);\n const json = cloneJsonWithStats(current, {\n ...LIMITS,\n maxDepth: remainingDepth(frames.length),\n maxNodes: remaining,\n });\n return wrapFrames(frozenJson(json.value), frames);\n}\n\nexport function decodeKaladaValue(input: unknown): KaladaValue {\n const frames: Frame[] = [];\n const active = new WeakSet<object>();\n let current = input;\n let nodes = 0;\n while (true) {\n nodes = charge(nodes, frames.length);\n const envelope = envelopeObject(current);\n if (active.has(envelope)) throw new TypeError(INVALID);\n active.add(envelope);\n const fields = envelopeFields(envelope);\n if (fields.type === \"Json\" && fields.variant === \"value\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n const value = decodeJson(dataValue(envelope, \"value\"), nodes, frames.length);\n return wrapValues(value, frames);\n }\n if (fields.type === \"Option\" && fields.variant === \"none\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\"]);\n return wrapValues(Option.none(), frames);\n }\n frames.push(payloadFrame(fields.type, fields.variant));\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n current = dataValue(envelope, \"value\");\n }\n}\n\nfunction decodeJson(input: unknown, nodes: number, depth: number): JsonValue {\n return cloneJson(input, {\n ...LIMITS,\n maxDepth: remainingDepth(depth),\n maxNodes: LIMITS.maxNodes - nodes,\n });\n}\n\nfunction envelopeObject(input: unknown): object {\n if (typeof input !== \"object\" || input === null || Array.isArray(input))\n throw new TypeError(INVALID);\n try {\n const prototype = Object.getPrototypeOf(input);\n if (prototype !== Object.prototype && prototype !== null) throw new TypeError(INVALID);\n return input;\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction envelopeFields(input: object): { type: unknown; variant: unknown } {\n try {\n if (dataValue(input, \"format\") !== \"kalada-value\" || dataValue(input, \"version\") !== 1) {\n throw new TypeError(INVALID);\n }\n return { type: dataValue(input, \"type\"), variant: dataValue(input, \"variant\") };\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction payloadFrame(type: unknown, variant: unknown): Frame {\n if (type === \"Option\" && variant === \"some\") return { type, variant };\n if (type === \"Result\" && (variant === \"ok\" || variant === \"err\")) return { type, variant };\n throw new TypeError(INVALID);\n}\n\nfunction assertKeys(input: object, expected: readonly string[]): void {\n let keys: PropertyKey[];\n try {\n keys = Reflect.ownKeys(input);\n } catch {\n throw new TypeError(INVALID);\n }\n if (\n keys.length !== expected.length ||\n !keys.every((key) => typeof key === \"string\" && expected.includes(key))\n ) {\n throw new TypeError(INVALID);\n }\n}\n\nfunction wrapFrames(leaf: EncodedKaladaValueV1, frames: readonly Frame[]): EncodedKaladaValueV1 {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output = Object.freeze({ format: \"kalada-value\", version: 1, ...frame, value: output });\n }\n return output;\n}\n\nfunction wrapValues(leaf: KaladaValue, frames: readonly Frame[]): KaladaValue {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output =\n frame.type === \"Option\"\n ? Option.some(output)\n : frame.variant === \"ok\"\n ? Result.ok(output)\n : Result.err(output);\n }\n return output;\n}\n\nfunction charge(nodes: number, depth: number): number {\n if (depth > LIMITS.maxDepth || nodes >= LIMITS.maxNodes)\n throw new RangeError(\"Kalada value exceeds its limits.\");\n return nodes + 1;\n}\n\nfunction remainingDepth(depth: number): number {\n const remaining = LIMITS.maxDepth - depth;\n if (remaining < 0) throw new RangeError(\"Kalada value exceeds its limits.\");\n return remaining;\n}\n\nfunction frozenNone(): EncodedKaladaValueV1 {\n return Object.freeze({ format: \"kalada-value\", version: 1, type: \"Option\", variant: \"none\" });\n}\n\nfunction frozenJson(value: JsonValue): EncodedKaladaValueV1 {\n return Object.freeze({\n format: \"kalada-value\",\n version: 1,\n type: \"Json\",\n variant: \"value\",\n value,\n });\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/codec.ts"],"names":[],"mappings":"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","file":"codec.js","sourcesContent":["import { cloneJson, cloneJsonWithStats, dataValue, type JsonValue } from \"./json.js\";\nimport { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\nimport {\n Duration,\n type DurationValue,\n Instant,\n type InstantValue,\n isDuration,\n isInstant,\n} from \"./temporal.js\";\nimport { isOption, isResult, type KaladaValue, Option, Result } from \"./values.js\";\n\ninterface EncodedHeader {\n readonly format: \"kalada-value\";\n readonly version: 1;\n}\n\nexport type EncodedKaladaValueV1 =\n | (EncodedHeader & {\n readonly type: \"Json\";\n readonly variant: \"value\";\n readonly value: JsonValue;\n })\n | (EncodedHeader & { readonly type: \"Option\"; readonly variant: \"none\" })\n | (EncodedHeader & {\n readonly type: \"Option\";\n readonly variant: \"some\";\n readonly value: EncodedKaladaValueV1;\n })\n | (EncodedHeader & {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n readonly value: EncodedKaladaValueV1;\n })\n | (EncodedHeader & {\n readonly type: \"Instant\" | \"Duration\";\n readonly variant: \"milliseconds\";\n readonly value: number;\n });\n\ntype Frame =\n | { readonly type: \"Option\"; readonly variant: \"some\" }\n | {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n };\n\nconst INVALID = \"Invalid kalada-value v1 envelope.\";\nconst LIMITS = Object.freeze({\n maxDepth: DEFAULT_KALADA_V1_LIMITS.maxValueDepth,\n maxNodes: DEFAULT_KALADA_V1_LIMITS.maxValueNodes,\n maxStringLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength,\n});\n\nexport function encodeKaladaValue(value: KaladaValue): EncodedKaladaValueV1 {\n const frames: Frame[] = [];\n const seen = new WeakSet<object>();\n let current = value;\n let nodes = 0;\n while (isOption(current) || isResult(current)) {\n nodes = charge(nodes, frames.length);\n if (seen.has(current)) throw new TypeError(INVALID);\n seen.add(current);\n if (isOption(current) && current.variant === \"none\") {\n return wrapFrames(frozenNone(), frames);\n }\n frames.push({ type: current.type, variant: current.variant } as Frame);\n current = current.value;\n }\n if (isInstant(current) || isDuration(current)) {\n charge(nodes, frames.length);\n return wrapFrames(frozenTemporal(current.type, current.milliseconds), frames);\n }\n const remaining = LIMITS.maxNodes - charge(nodes, frames.length);\n const json = cloneJsonWithStats(current, {\n ...LIMITS,\n maxDepth: remainingDepth(frames.length),\n maxNodes: remaining,\n });\n return wrapFrames(frozenJson(json.value), frames);\n}\n\nexport function decodeKaladaValue(input: unknown): KaladaValue {\n const frames: Frame[] = [];\n const active = new WeakSet<object>();\n let current = input;\n let nodes = 0;\n while (true) {\n nodes = charge(nodes, frames.length);\n const envelope = envelopeObject(current);\n if (active.has(envelope)) throw new TypeError(INVALID);\n active.add(envelope);\n const fields = envelopeFields(envelope);\n const temporal = decodeTemporal(envelope, fields);\n if (temporal) return wrapValues(temporal, frames);\n if (fields.type === \"Json\" && fields.variant === \"value\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n const value = decodeJson(dataValue(envelope, \"value\"), nodes, frames.length);\n return wrapValues(value, frames);\n }\n if (fields.type === \"Option\" && fields.variant === \"none\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\"]);\n return wrapValues(Option.none(), frames);\n }\n frames.push(payloadFrame(fields.type, fields.variant));\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n current = dataValue(envelope, \"value\");\n }\n}\n\nfunction decodeTemporal(\n envelope: object,\n fields: { type: unknown; variant: unknown },\n): InstantValue | DurationValue | undefined {\n if (fields.type !== \"Instant\" && fields.type !== \"Duration\") return undefined;\n if (fields.variant !== \"milliseconds\") throw new TypeError(INVALID);\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n const value = dataValue(envelope, \"value\");\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) throw new TypeError(INVALID);\n return fields.type === \"Instant\"\n ? Instant.fromMilliseconds(value)\n : Duration.fromMilliseconds(value);\n}\n\nfunction decodeJson(input: unknown, nodes: number, depth: number): JsonValue {\n return cloneJson(input, {\n ...LIMITS,\n maxDepth: remainingDepth(depth),\n maxNodes: LIMITS.maxNodes - nodes,\n });\n}\n\nfunction envelopeObject(input: unknown): object {\n if (typeof input !== \"object\" || input === null || Array.isArray(input))\n throw new TypeError(INVALID);\n try {\n const prototype = Object.getPrototypeOf(input);\n if (prototype !== Object.prototype && prototype !== null) throw new TypeError(INVALID);\n return input;\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction envelopeFields(input: object): { type: unknown; variant: unknown } {\n try {\n if (dataValue(input, \"format\") !== \"kalada-value\" || dataValue(input, \"version\") !== 1) {\n throw new TypeError(INVALID);\n }\n return { type: dataValue(input, \"type\"), variant: dataValue(input, \"variant\") };\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction payloadFrame(type: unknown, variant: unknown): Frame {\n if (type === \"Option\" && variant === \"some\") return { type, variant };\n if (type === \"Result\" && (variant === \"ok\" || variant === \"err\")) return { type, variant };\n throw new TypeError(INVALID);\n}\n\nfunction assertKeys(input: object, expected: readonly string[]): void {\n let keys: PropertyKey[];\n try {\n keys = Reflect.ownKeys(input);\n } catch {\n throw new TypeError(INVALID);\n }\n if (\n keys.length !== expected.length ||\n !keys.every((key) => typeof key === \"string\" && expected.includes(key))\n ) {\n throw new TypeError(INVALID);\n }\n}\n\nfunction wrapFrames(leaf: EncodedKaladaValueV1, frames: readonly Frame[]): EncodedKaladaValueV1 {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output = Object.freeze({ format: \"kalada-value\", version: 1, ...frame, value: output });\n }\n return output;\n}\n\nfunction wrapValues(leaf: KaladaValue, frames: readonly Frame[]): KaladaValue {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output =\n frame.type === \"Option\"\n ? Option.some(output)\n : frame.variant === \"ok\"\n ? Result.ok(output)\n : Result.err(output);\n }\n return output;\n}\n\nfunction charge(nodes: number, depth: number): number {\n if (depth > LIMITS.maxDepth || nodes >= LIMITS.maxNodes)\n throw new RangeError(\"Kalada value exceeds its limits.\");\n return nodes + 1;\n}\n\nfunction remainingDepth(depth: number): number {\n const remaining = LIMITS.maxDepth - depth;\n if (remaining < 0) throw new RangeError(\"Kalada value exceeds its limits.\");\n return remaining;\n}\n\nfunction frozenNone(): EncodedKaladaValueV1 {\n return Object.freeze({ format: \"kalada-value\", version: 1, type: \"Option\", variant: \"none\" });\n}\n\nfunction frozenJson(value: JsonValue): EncodedKaladaValueV1 {\n return Object.freeze({\n format: \"kalada-value\",\n version: 1,\n type: \"Json\",\n variant: \"value\",\n value,\n });\n}\n\nfunction frozenTemporal(type: \"Instant\" | \"Duration\", value: number): EncodedKaladaValueV1 {\n return Object.freeze({\n format: \"kalada-value\",\n version: 1,\n type,\n variant: \"milliseconds\",\n value,\n });\n}\n"]}
@@ -1,10 +1,12 @@
1
1
  'use strict';
2
2
 
3
+ var callbackPromise_js = require('../kuery-v1/callback-promise.js');
3
4
  var canonicalize_js = require('./canonicalize.js');
4
5
  var dependencies_js = require('./dependencies.js');
5
6
  var diagnostics_js = require('./diagnostics.js');
6
7
  var evaluate_js = require('./evaluate.js');
7
8
  var limits_js = require('./limits.js');
9
+ var temporal_js = require('./temporal.js');
8
10
 
9
11
  function compileKaladaV1Program(input, options = {}) {
10
12
  const canonical = canonicalize_js.canonicalizeKaladaV1Program(input, options);
@@ -21,10 +23,22 @@ function compileKaladaV1Program(input, options = {}) {
21
23
  Object.freeze({
22
24
  program,
23
25
  dependencies,
24
- evaluate: (resolve) => evaluate_js.evaluateKaladaV1(program.expression, resolve, limits)
26
+ evaluate: (resolve, inputs) => evaluate_js.evaluateKaladaV1(program.expression, resolve, limits, inputs),
27
+ evaluateWithClock: (resolve, clock) => evaluateWithClock(program.expression, resolve, limits, clock)
25
28
  })
26
29
  );
27
30
  }
31
+ function evaluateWithClock(expression, resolve, limits, clock) {
32
+ let sample;
33
+ try {
34
+ sample = clock();
35
+ } catch {
36
+ return diagnostics_js.failure("KALADA_CLOCK_ERROR", ["clock"]);
37
+ }
38
+ if (callbackPromise_js.rejectCallbackPromise(sample)) return diagnostics_js.failure("KALADA_ASYNC_UNSUPPORTED", ["clock"]);
39
+ if (!temporal_js.isInstant(sample)) return diagnostics_js.failure("KALADA_INVALID_CLOCK", ["clock"]);
40
+ return evaluate_js.evaluateKaladaV1(expression, resolve, limits, { instant: sample });
41
+ }
28
42
 
29
43
  exports.compileKaladaV1Program = compileKaladaV1Program;
30
44
  //# sourceMappingURL=compile.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/compile.ts"],"names":["canonicalizeKaladaV1Program","resolveLimits","failure","collectKaladaV1Dependencies","success","evaluateKaladaV1"],"mappings":";;;;;;;;AAcO,SAAS,sBAAA,CACd,KAAA,EACA,OAAA,GAA8B,EAAC,EACc;AAC7C,EAAA,MAAM,SAAA,GAAYA,2CAAA,CAA+B,KAAA,EAAO,OAAO,CAAA;AAC/D,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA;AAC1B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAASC,uBAAA,CAAc,QAAQ,MAAM,CAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAOC,sBAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA;AAAA,EAC5C;AACA,EAAA,MAAM,UAAU,SAAA,CAAU,KAAA;AAC1B,EAAA,MAAM,YAAA,GAAeC,2CAAA,CAA4B,OAAA,CAAQ,UAAU,CAAA;AACnE,EAAA,OAAOC,sBAAA;AAAA,IACL,OAAO,MAAA,CAAO;AAAA,MACZ,OAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAU,CAAC,OAAA,KACTC,6BAAiB,OAAA,CAAQ,UAAA,EAAY,SAAS,MAAM;AAAA,KACvD;AAAA,GACH;AACF","file":"compile.cjs","sourcesContent":["import { canonicalizeKaladaV1Program } from \"./canonicalize.js\";\nimport { collectKaladaV1Dependencies } from \"./dependencies.js\";\nimport { failure, success } from \"./diagnostics.js\";\nimport { evaluateKaladaV1 } from \"./evaluate.js\";\nimport type { JsonValue } from \"./json.js\";\nimport { resolveLimits } from \"./limits.js\";\nimport type {\n CompiledKaladaV1Program,\n KaladaV1Limits,\n KaladaV1Options,\n KaladaV1Outcome,\n KaladaV1Resolver,\n} from \"./types.js\";\n\nexport function compileKaladaV1Program<R extends JsonValue = string>(\n input: unknown,\n options: KaladaV1Options<R> = {},\n): KaladaV1Outcome<CompiledKaladaV1Program<R>> {\n const canonical = canonicalizeKaladaV1Program<R>(input, options);\n if (!canonical.ok) return canonical;\n let limits: KaladaV1Limits;\n try {\n limits = resolveLimits(options.limits);\n } catch {\n return failure(\"KALADA_LIMIT_EXCEEDED\", []);\n }\n const program = canonical.value;\n const dependencies = collectKaladaV1Dependencies(program.expression);\n return success(\n Object.freeze({\n program,\n dependencies,\n evaluate: (resolve: KaladaV1Resolver<R>) =>\n evaluateKaladaV1(program.expression, resolve, limits),\n }),\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/compile.ts"],"names":["canonicalizeKaladaV1Program","resolveLimits","failure","collectKaladaV1Dependencies","success","evaluateKaladaV1","rejectCallbackPromise","isInstant"],"mappings":";;;;;;;;;;AAkBO,SAAS,sBAAA,CACd,KAAA,EACA,OAAA,GAA8B,EAAC,EACc;AAC7C,EAAA,MAAM,SAAA,GAAYA,2CAAA,CAA+B,KAAA,EAAO,OAAO,CAAA;AAC/D,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA;AAC1B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAASC,uBAAA,CAAc,QAAQ,MAAM,CAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAOC,sBAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA;AAAA,EAC5C;AACA,EAAA,MAAM,UAAU,SAAA,CAAU,KAAA;AAC1B,EAAA,MAAM,YAAA,GAAeC,2CAAA,CAA4B,OAAA,CAAQ,UAAU,CAAA;AACnE,EAAA,OAAOC,sBAAA;AAAA,IACL,OAAO,MAAA,CAAO;AAAA,MACZ,OAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA,EAAU,CAAC,OAAA,EAA8B,MAAA,KACvCC,6BAAiB,OAAA,CAAQ,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA;AAAA,MAC9D,iBAAA,EAAmB,CAAC,OAAA,EAA8B,KAAA,KAChD,kBAAkB,OAAA,CAAQ,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,KAAK;AAAA,KAC/D;AAAA,GACH;AACF;AAEA,SAAS,iBAAA,CACP,UAAA,EACA,OAAA,EACA,MAAA,EACA,KAAA,EACwC;AACxC,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,KAAA,EAAM;AAAA,EACjB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAOH,sBAAA,CAAQ,oBAAA,EAAsB,CAAC,OAAO,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,IAAII,wCAAA,CAAsB,MAAM,CAAA,EAAG,OAAOJ,uBAAQ,0BAAA,EAA4B,CAAC,OAAO,CAAC,CAAA;AACvF,EAAA,IAAI,CAACK,sBAAU,MAAM,CAAA,SAAUL,sBAAA,CAAQ,sBAAA,EAAwB,CAAC,OAAO,CAAC,CAAA;AACxE,EAAA,OAAOG,6BAAiB,UAAA,EAAY,OAAA,EAAS,QAAQ,EAAE,OAAA,EAAS,QAAQ,CAAA;AAC1E","file":"compile.cjs","sourcesContent":["import { rejectCallbackPromise } from \"../kuery-v1/callback-promise.js\";\nimport { canonicalizeKaladaV1Program } from \"./canonicalize.js\";\nimport { collectKaladaV1Dependencies } from \"./dependencies.js\";\nimport { failure, success } from \"./diagnostics.js\";\nimport { evaluateKaladaV1 } from \"./evaluate.js\";\nimport type { JsonValue } from \"./json.js\";\nimport { resolveLimits } from \"./limits.js\";\nimport { isInstant } from \"./temporal.js\";\nimport type {\n CompiledKaladaV1Program,\n KaladaV1Clock,\n KaladaV1EvaluationInputs,\n KaladaV1Limits,\n KaladaV1Options,\n KaladaV1Outcome,\n KaladaV1Resolver,\n} from \"./types.js\";\n\nexport function compileKaladaV1Program<R extends JsonValue = string>(\n input: unknown,\n options: KaladaV1Options<R> = {},\n): KaladaV1Outcome<CompiledKaladaV1Program<R>> {\n const canonical = canonicalizeKaladaV1Program<R>(input, options);\n if (!canonical.ok) return canonical;\n let limits: KaladaV1Limits;\n try {\n limits = resolveLimits(options.limits);\n } catch {\n return failure(\"KALADA_LIMIT_EXCEEDED\", []);\n }\n const program = canonical.value;\n const dependencies = collectKaladaV1Dependencies(program.expression);\n return success(\n Object.freeze({\n program,\n dependencies,\n evaluate: (resolve: KaladaV1Resolver<R>, inputs?: KaladaV1EvaluationInputs) =>\n evaluateKaladaV1(program.expression, resolve, limits, inputs),\n evaluateWithClock: (resolve: KaladaV1Resolver<R>, clock: KaladaV1Clock) =>\n evaluateWithClock(program.expression, resolve, limits, clock),\n }),\n );\n}\n\nfunction evaluateWithClock<R extends JsonValue>(\n expression: Parameters<typeof evaluateKaladaV1<R>>[0],\n resolve: KaladaV1Resolver<R>,\n limits: KaladaV1Limits,\n clock: KaladaV1Clock,\n): ReturnType<typeof evaluateKaladaV1<R>> {\n let sample: unknown;\n try {\n sample = clock();\n } catch {\n return failure(\"KALADA_CLOCK_ERROR\", [\"clock\"]);\n }\n if (rejectCallbackPromise(sample)) return failure(\"KALADA_ASYNC_UNSUPPORTED\", [\"clock\"]);\n if (!isInstant(sample)) return failure(\"KALADA_INVALID_CLOCK\", [\"clock\"]);\n return evaluateKaladaV1(expression, resolve, limits, { instant: sample });\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { JsonValue } from './json.cjs';
2
2
  import { KaladaV1Options, KaladaV1Outcome, CompiledKaladaV1Program } from './types.cjs';
3
+ import './temporal.cjs';
3
4
  import './values.cjs';
4
5
 
5
6
  declare function compileKaladaV1Program<R extends JsonValue = string>(input: unknown, options?: KaladaV1Options<R>): KaladaV1Outcome<CompiledKaladaV1Program<R>>;
@@ -1,5 +1,6 @@
1
1
  import { JsonValue } from './json.js';
2
2
  import { KaladaV1Options, KaladaV1Outcome, CompiledKaladaV1Program } from './types.js';
3
+ import './temporal.js';
3
4
  import './values.js';
4
5
 
5
6
  declare function compileKaladaV1Program<R extends JsonValue = string>(input: unknown, options?: KaladaV1Options<R>): KaladaV1Outcome<CompiledKaladaV1Program<R>>;
@@ -1,8 +1,10 @@
1
+ import { rejectCallbackPromise } from '../kuery-v1/callback-promise.js';
1
2
  import { canonicalizeKaladaV1Program } from './canonicalize.js';
2
3
  import { collectKaladaV1Dependencies } from './dependencies.js';
3
4
  import { failure, success } from './diagnostics.js';
4
5
  import { evaluateKaladaV1 } from './evaluate.js';
5
6
  import { resolveLimits } from './limits.js';
7
+ import { isInstant } from './temporal.js';
6
8
 
7
9
  function compileKaladaV1Program(input, options = {}) {
8
10
  const canonical = canonicalizeKaladaV1Program(input, options);
@@ -19,10 +21,22 @@ function compileKaladaV1Program(input, options = {}) {
19
21
  Object.freeze({
20
22
  program,
21
23
  dependencies,
22
- evaluate: (resolve) => evaluateKaladaV1(program.expression, resolve, limits)
24
+ evaluate: (resolve, inputs) => evaluateKaladaV1(program.expression, resolve, limits, inputs),
25
+ evaluateWithClock: (resolve, clock) => evaluateWithClock(program.expression, resolve, limits, clock)
23
26
  })
24
27
  );
25
28
  }
29
+ function evaluateWithClock(expression, resolve, limits, clock) {
30
+ let sample;
31
+ try {
32
+ sample = clock();
33
+ } catch {
34
+ return failure("KALADA_CLOCK_ERROR", ["clock"]);
35
+ }
36
+ if (rejectCallbackPromise(sample)) return failure("KALADA_ASYNC_UNSUPPORTED", ["clock"]);
37
+ if (!isInstant(sample)) return failure("KALADA_INVALID_CLOCK", ["clock"]);
38
+ return evaluateKaladaV1(expression, resolve, limits, { instant: sample });
39
+ }
26
40
 
27
41
  export { compileKaladaV1Program };
28
42
  //# sourceMappingURL=compile.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/compile.ts"],"names":[],"mappings":";;;;;;AAcO,SAAS,sBAAA,CACd,KAAA,EACA,OAAA,GAA8B,EAAC,EACc;AAC7C,EAAA,MAAM,SAAA,GAAY,2BAAA,CAA+B,KAAA,EAAO,OAAO,CAAA;AAC/D,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA;AAC1B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,aAAA,CAAc,QAAQ,MAAM,CAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA;AAAA,EAC5C;AACA,EAAA,MAAM,UAAU,SAAA,CAAU,KAAA;AAC1B,EAAA,MAAM,YAAA,GAAe,2BAAA,CAA4B,OAAA,CAAQ,UAAU,CAAA;AACnE,EAAA,OAAO,OAAA;AAAA,IACL,OAAO,MAAA,CAAO;AAAA,MACZ,OAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAU,CAAC,OAAA,KACT,iBAAiB,OAAA,CAAQ,UAAA,EAAY,SAAS,MAAM;AAAA,KACvD;AAAA,GACH;AACF","file":"compile.js","sourcesContent":["import { canonicalizeKaladaV1Program } from \"./canonicalize.js\";\nimport { collectKaladaV1Dependencies } from \"./dependencies.js\";\nimport { failure, success } from \"./diagnostics.js\";\nimport { evaluateKaladaV1 } from \"./evaluate.js\";\nimport type { JsonValue } from \"./json.js\";\nimport { resolveLimits } from \"./limits.js\";\nimport type {\n CompiledKaladaV1Program,\n KaladaV1Limits,\n KaladaV1Options,\n KaladaV1Outcome,\n KaladaV1Resolver,\n} from \"./types.js\";\n\nexport function compileKaladaV1Program<R extends JsonValue = string>(\n input: unknown,\n options: KaladaV1Options<R> = {},\n): KaladaV1Outcome<CompiledKaladaV1Program<R>> {\n const canonical = canonicalizeKaladaV1Program<R>(input, options);\n if (!canonical.ok) return canonical;\n let limits: KaladaV1Limits;\n try {\n limits = resolveLimits(options.limits);\n } catch {\n return failure(\"KALADA_LIMIT_EXCEEDED\", []);\n }\n const program = canonical.value;\n const dependencies = collectKaladaV1Dependencies(program.expression);\n return success(\n Object.freeze({\n program,\n dependencies,\n evaluate: (resolve: KaladaV1Resolver<R>) =>\n evaluateKaladaV1(program.expression, resolve, limits),\n }),\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/compile.ts"],"names":[],"mappings":";;;;;;;;AAkBO,SAAS,sBAAA,CACd,KAAA,EACA,OAAA,GAA8B,EAAC,EACc;AAC7C,EAAA,MAAM,SAAA,GAAY,2BAAA,CAA+B,KAAA,EAAO,OAAO,CAAA;AAC/D,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA;AAC1B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,aAAA,CAAc,QAAQ,MAAM,CAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA;AAAA,EAC5C;AACA,EAAA,MAAM,UAAU,SAAA,CAAU,KAAA;AAC1B,EAAA,MAAM,YAAA,GAAe,2BAAA,CAA4B,OAAA,CAAQ,UAAU,CAAA;AACnE,EAAA,OAAO,OAAA;AAAA,IACL,OAAO,MAAA,CAAO;AAAA,MACZ,OAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA,EAAU,CAAC,OAAA,EAA8B,MAAA,KACvC,iBAAiB,OAAA,CAAQ,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA;AAAA,MAC9D,iBAAA,EAAmB,CAAC,OAAA,EAA8B,KAAA,KAChD,kBAAkB,OAAA,CAAQ,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,KAAK;AAAA,KAC/D;AAAA,GACH;AACF;AAEA,SAAS,iBAAA,CACP,UAAA,EACA,OAAA,EACA,MAAA,EACA,KAAA,EACwC;AACxC,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,KAAA,EAAM;AAAA,EACjB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAA,CAAQ,oBAAA,EAAsB,CAAC,OAAO,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,qBAAA,CAAsB,MAAM,CAAA,EAAG,OAAO,QAAQ,0BAAA,EAA4B,CAAC,OAAO,CAAC,CAAA;AACvF,EAAA,IAAI,CAAC,UAAU,MAAM,CAAA,SAAU,OAAA,CAAQ,sBAAA,EAAwB,CAAC,OAAO,CAAC,CAAA;AACxE,EAAA,OAAO,iBAAiB,UAAA,EAAY,OAAA,EAAS,QAAQ,EAAE,OAAA,EAAS,QAAQ,CAAA;AAC1E","file":"compile.js","sourcesContent":["import { rejectCallbackPromise } from \"../kuery-v1/callback-promise.js\";\nimport { canonicalizeKaladaV1Program } from \"./canonicalize.js\";\nimport { collectKaladaV1Dependencies } from \"./dependencies.js\";\nimport { failure, success } from \"./diagnostics.js\";\nimport { evaluateKaladaV1 } from \"./evaluate.js\";\nimport type { JsonValue } from \"./json.js\";\nimport { resolveLimits } from \"./limits.js\";\nimport { isInstant } from \"./temporal.js\";\nimport type {\n CompiledKaladaV1Program,\n KaladaV1Clock,\n KaladaV1EvaluationInputs,\n KaladaV1Limits,\n KaladaV1Options,\n KaladaV1Outcome,\n KaladaV1Resolver,\n} from \"./types.js\";\n\nexport function compileKaladaV1Program<R extends JsonValue = string>(\n input: unknown,\n options: KaladaV1Options<R> = {},\n): KaladaV1Outcome<CompiledKaladaV1Program<R>> {\n const canonical = canonicalizeKaladaV1Program<R>(input, options);\n if (!canonical.ok) return canonical;\n let limits: KaladaV1Limits;\n try {\n limits = resolveLimits(options.limits);\n } catch {\n return failure(\"KALADA_LIMIT_EXCEEDED\", []);\n }\n const program = canonical.value;\n const dependencies = collectKaladaV1Dependencies(program.expression);\n return success(\n Object.freeze({\n program,\n dependencies,\n evaluate: (resolve: KaladaV1Resolver<R>, inputs?: KaladaV1EvaluationInputs) =>\n evaluateKaladaV1(program.expression, resolve, limits, inputs),\n evaluateWithClock: (resolve: KaladaV1Resolver<R>, clock: KaladaV1Clock) =>\n evaluateWithClock(program.expression, resolve, limits, clock),\n }),\n );\n}\n\nfunction evaluateWithClock<R extends JsonValue>(\n expression: Parameters<typeof evaluateKaladaV1<R>>[0],\n resolve: KaladaV1Resolver<R>,\n limits: KaladaV1Limits,\n clock: KaladaV1Clock,\n): ReturnType<typeof evaluateKaladaV1<R>> {\n let sample: unknown;\n try {\n sample = clock();\n } catch {\n return failure(\"KALADA_CLOCK_ERROR\", [\"clock\"]);\n }\n if (rejectCallbackPromise(sample)) return failure(\"KALADA_ASYNC_UNSUPPORTED\", [\"clock\"]);\n if (!isInstant(sample)) return failure(\"KALADA_INVALID_CLOCK\", [\"clock\"]);\n return evaluateKaladaV1(expression, resolve, limits, { instant: sample });\n}\n"]}
@@ -13,7 +13,8 @@ function visit(node, scope, output, identities) {
13
13
  addReference(node.ref, scope, output, identities);
14
14
  return;
15
15
  }
16
- if (node.kind === "literal" || node.kind === "option" && node.variant === "none") return;
16
+ if (node.kind === "literal" || node.kind === "instant" || node.kind === "duration" || node.kind === "current-instant" || node.kind === "option" && node.variant === "none")
17
+ return;
17
18
  if (node.kind === "binding") {
18
19
  visitBinding(node, scope, output, identities);
19
20
  return;
@@ -22,6 +23,11 @@ function visit(node, scope, output, identities) {
22
23
  visitMatch(node.value, node.arms, scope, output, identities);
23
24
  return;
24
25
  }
26
+ if (node.kind === "temporal-arithmetic" || node.kind === "temporal-comparison") {
27
+ visit(node.left, scope, output, identities);
28
+ visit(node.right, scope, output, identities);
29
+ return;
30
+ }
25
31
  visit(node.value, scope, output, identities);
26
32
  }
27
33
  function visitBinding(node, scope, output, identities) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/dependencies.ts"],"names":["canonicalJsonIdentity"],"mappings":";;;;AAGO,SAAS,4BACd,UAAA,EACc;AACd,EAAA,MAAM,SAAc,EAAC;AACrB,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,CAAM,UAAA,kBAAY,IAAI,GAAA,EAAI,EAAG,QAAQ,UAAU,CAAA;AAC/C,EAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B;AAEA,SAAS,KAAA,CACP,IAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,IAAA,YAAA,CAAa,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAChD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,IAAc,IAAA,CAAK,SAAS,QAAA,IAAY,IAAA,CAAK,YAAY,MAAA,EAAS;AACpF,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,IAAA,YAAA,CAAa,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC5C,IAAA;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,UAAA,CAAW,KAAK,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,QAAQ,UAAU,CAAA;AAC3D,IAAA;AAAA,EACF;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC7C;AAEA,SAAS,YAAA,CACP,IAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC3C,EAAA,KAAA,CAAM,IAAA,CAAK,MAAM,QAAA,CAAS,KAAA,EAAO,KAAK,IAAI,CAAA,EAAG,QAAQ,UAAU,CAAA;AACjE;AAEA,SAAS,UAAA,CACP,KAAA,EACA,IAAA,EACA,KAAA,EACA,QACA,UAAA,EACM;AACN,EAAA,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AACtC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,CAAM,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAA,GAAU,QAAA,CAAS,KAAA,EAAO,GAAA,CAAI,OAAO,CAAA,GAAI,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAAA,EACxF;AACF;AAEA,SAAS,YAAA,CACP,SAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3D,EAAA,MAAM,QAAA,GAAWA,8BAAsB,SAAS,CAAA;AAChD,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,EAAA,UAAA,CAAW,IAAI,QAAQ,CAAA;AACvB,EAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACvB;AAEA,SAAS,QAAA,CAAS,OAA4B,IAAA,EAAmC;AAC/E,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,KAAK,CAAA;AAC5B,EAAA,MAAA,CAAO,IAAI,IAAI,CAAA;AACf,EAAA,OAAO,MAAA;AACT","file":"dependencies.cjs","sourcesContent":["import { canonicalJsonIdentity, type JsonValue } from \"./json.js\";\nimport type { KaladaV1Expression, MatchArm } from \"./types.js\";\n\nexport function collectKaladaV1Dependencies<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n): readonly R[] {\n const output: R[] = [];\n const identities = new Set<string>();\n visit(expression, new Set(), output, identities);\n return Object.freeze(output);\n}\n\nfunction visit<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (node.kind === \"ref\") {\n addReference(node.ref, scope, output, identities);\n return;\n }\n if (node.kind === \"literal\" || (node.kind === \"option\" && node.variant === \"none\")) return;\n if (node.kind === \"binding\") {\n visitBinding(node, scope, output, identities);\n return;\n }\n if (node.kind === \"match\") {\n visitMatch(node.value, node.arms, scope, output, identities);\n return;\n }\n visit(node.value, scope, output, identities);\n}\n\nfunction visitBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(node.value, scope, output, identities);\n visit(node.body, extended(scope, node.name), output, identities);\n}\n\nfunction visitMatch<R extends JsonValue>(\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(value, scope, output, identities);\n for (const arm of arms) {\n visit(arm.body, arm.binding ? extended(scope, arm.binding) : scope, output, identities);\n }\n}\n\nfunction addReference<R extends JsonValue>(\n reference: R,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (typeof reference === \"string\" && scope.has(reference)) return;\n const identity = canonicalJsonIdentity(reference);\n if (identities.has(identity)) return;\n identities.add(identity);\n output.push(reference);\n}\n\nfunction extended(scope: ReadonlySet<string>, name: string): ReadonlySet<string> {\n const output = new Set(scope);\n output.add(name);\n return output;\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/dependencies.ts"],"names":["canonicalJsonIdentity"],"mappings":"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","file":"dependencies.cjs","sourcesContent":["import { canonicalJsonIdentity, type JsonValue } from \"./json.js\";\nimport type { KaladaV1Expression, MatchArm } from \"./types.js\";\n\nexport function collectKaladaV1Dependencies<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n): readonly R[] {\n const output: R[] = [];\n const identities = new Set<string>();\n visit(expression, new Set(), output, identities);\n return Object.freeze(output);\n}\n\nfunction visit<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (node.kind === \"ref\") {\n addReference(node.ref, scope, output, identities);\n return;\n }\n if (\n node.kind === \"literal\" ||\n node.kind === \"instant\" ||\n node.kind === \"duration\" ||\n node.kind === \"current-instant\" ||\n (node.kind === \"option\" && node.variant === \"none\")\n )\n return;\n if (node.kind === \"binding\") {\n visitBinding(node, scope, output, identities);\n return;\n }\n if (node.kind === \"match\") {\n visitMatch(node.value, node.arms, scope, output, identities);\n return;\n }\n if (node.kind === \"temporal-arithmetic\" || node.kind === \"temporal-comparison\") {\n visit(node.left, scope, output, identities);\n visit(node.right, scope, output, identities);\n return;\n }\n visit(node.value, scope, output, identities);\n}\n\nfunction visitBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(node.value, scope, output, identities);\n visit(node.body, extended(scope, node.name), output, identities);\n}\n\nfunction visitMatch<R extends JsonValue>(\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(value, scope, output, identities);\n for (const arm of arms) {\n visit(arm.body, arm.binding ? extended(scope, arm.binding) : scope, output, identities);\n }\n}\n\nfunction addReference<R extends JsonValue>(\n reference: R,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (typeof reference === \"string\" && scope.has(reference)) return;\n const identity = canonicalJsonIdentity(reference);\n if (identities.has(identity)) return;\n identities.add(identity);\n output.push(reference);\n}\n\nfunction extended(scope: ReadonlySet<string>, name: string): ReadonlySet<string> {\n const output = new Set(scope);\n output.add(name);\n return output;\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { JsonValue } from './json.cjs';
2
2
  import { KaladaV1Expression } from './types.cjs';
3
+ import './temporal.cjs';
3
4
  import './values.cjs';
4
5
 
5
6
  declare function collectKaladaV1Dependencies<R extends JsonValue>(expression: KaladaV1Expression<R>): readonly R[];
@@ -1,5 +1,6 @@
1
1
  import { JsonValue } from './json.js';
2
2
  import { KaladaV1Expression } from './types.js';
3
+ import './temporal.js';
3
4
  import './values.js';
4
5
 
5
6
  declare function collectKaladaV1Dependencies<R extends JsonValue>(expression: KaladaV1Expression<R>): readonly R[];
@@ -11,7 +11,8 @@ function visit(node, scope, output, identities) {
11
11
  addReference(node.ref, scope, output, identities);
12
12
  return;
13
13
  }
14
- if (node.kind === "literal" || node.kind === "option" && node.variant === "none") return;
14
+ if (node.kind === "literal" || node.kind === "instant" || node.kind === "duration" || node.kind === "current-instant" || node.kind === "option" && node.variant === "none")
15
+ return;
15
16
  if (node.kind === "binding") {
16
17
  visitBinding(node, scope, output, identities);
17
18
  return;
@@ -20,6 +21,11 @@ function visit(node, scope, output, identities) {
20
21
  visitMatch(node.value, node.arms, scope, output, identities);
21
22
  return;
22
23
  }
24
+ if (node.kind === "temporal-arithmetic" || node.kind === "temporal-comparison") {
25
+ visit(node.left, scope, output, identities);
26
+ visit(node.right, scope, output, identities);
27
+ return;
28
+ }
23
29
  visit(node.value, scope, output, identities);
24
30
  }
25
31
  function visitBinding(node, scope, output, identities) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/dependencies.ts"],"names":[],"mappings":";;AAGO,SAAS,4BACd,UAAA,EACc;AACd,EAAA,MAAM,SAAc,EAAC;AACrB,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,CAAM,UAAA,kBAAY,IAAI,GAAA,EAAI,EAAG,QAAQ,UAAU,CAAA;AAC/C,EAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B;AAEA,SAAS,KAAA,CACP,IAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,IAAA,YAAA,CAAa,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAChD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,IAAc,IAAA,CAAK,SAAS,QAAA,IAAY,IAAA,CAAK,YAAY,MAAA,EAAS;AACpF,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,IAAA,YAAA,CAAa,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC5C,IAAA;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,UAAA,CAAW,KAAK,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,QAAQ,UAAU,CAAA;AAC3D,IAAA;AAAA,EACF;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC7C;AAEA,SAAS,YAAA,CACP,IAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC3C,EAAA,KAAA,CAAM,IAAA,CAAK,MAAM,QAAA,CAAS,KAAA,EAAO,KAAK,IAAI,CAAA,EAAG,QAAQ,UAAU,CAAA;AACjE;AAEA,SAAS,UAAA,CACP,KAAA,EACA,IAAA,EACA,KAAA,EACA,QACA,UAAA,EACM;AACN,EAAA,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AACtC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,CAAM,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAA,GAAU,QAAA,CAAS,KAAA,EAAO,GAAA,CAAI,OAAO,CAAA,GAAI,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAAA,EACxF;AACF;AAEA,SAAS,YAAA,CACP,SAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3D,EAAA,MAAM,QAAA,GAAW,sBAAsB,SAAS,CAAA;AAChD,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,EAAA,UAAA,CAAW,IAAI,QAAQ,CAAA;AACvB,EAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACvB;AAEA,SAAS,QAAA,CAAS,OAA4B,IAAA,EAAmC;AAC/E,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,KAAK,CAAA;AAC5B,EAAA,MAAA,CAAO,IAAI,IAAI,CAAA;AACf,EAAA,OAAO,MAAA;AACT","file":"dependencies.js","sourcesContent":["import { canonicalJsonIdentity, type JsonValue } from \"./json.js\";\nimport type { KaladaV1Expression, MatchArm } from \"./types.js\";\n\nexport function collectKaladaV1Dependencies<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n): readonly R[] {\n const output: R[] = [];\n const identities = new Set<string>();\n visit(expression, new Set(), output, identities);\n return Object.freeze(output);\n}\n\nfunction visit<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (node.kind === \"ref\") {\n addReference(node.ref, scope, output, identities);\n return;\n }\n if (node.kind === \"literal\" || (node.kind === \"option\" && node.variant === \"none\")) return;\n if (node.kind === \"binding\") {\n visitBinding(node, scope, output, identities);\n return;\n }\n if (node.kind === \"match\") {\n visitMatch(node.value, node.arms, scope, output, identities);\n return;\n }\n visit(node.value, scope, output, identities);\n}\n\nfunction visitBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(node.value, scope, output, identities);\n visit(node.body, extended(scope, node.name), output, identities);\n}\n\nfunction visitMatch<R extends JsonValue>(\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(value, scope, output, identities);\n for (const arm of arms) {\n visit(arm.body, arm.binding ? extended(scope, arm.binding) : scope, output, identities);\n }\n}\n\nfunction addReference<R extends JsonValue>(\n reference: R,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (typeof reference === \"string\" && scope.has(reference)) return;\n const identity = canonicalJsonIdentity(reference);\n if (identities.has(identity)) return;\n identities.add(identity);\n output.push(reference);\n}\n\nfunction extended(scope: ReadonlySet<string>, name: string): ReadonlySet<string> {\n const output = new Set(scope);\n output.add(name);\n return output;\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/dependencies.ts"],"names":[],"mappings":"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","file":"dependencies.js","sourcesContent":["import { canonicalJsonIdentity, type JsonValue } from \"./json.js\";\nimport type { KaladaV1Expression, MatchArm } from \"./types.js\";\n\nexport function collectKaladaV1Dependencies<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n): readonly R[] {\n const output: R[] = [];\n const identities = new Set<string>();\n visit(expression, new Set(), output, identities);\n return Object.freeze(output);\n}\n\nfunction visit<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (node.kind === \"ref\") {\n addReference(node.ref, scope, output, identities);\n return;\n }\n if (\n node.kind === \"literal\" ||\n node.kind === \"instant\" ||\n node.kind === \"duration\" ||\n node.kind === \"current-instant\" ||\n (node.kind === \"option\" && node.variant === \"none\")\n )\n return;\n if (node.kind === \"binding\") {\n visitBinding(node, scope, output, identities);\n return;\n }\n if (node.kind === \"match\") {\n visitMatch(node.value, node.arms, scope, output, identities);\n return;\n }\n if (node.kind === \"temporal-arithmetic\" || node.kind === \"temporal-comparison\") {\n visit(node.left, scope, output, identities);\n visit(node.right, scope, output, identities);\n return;\n }\n visit(node.value, scope, output, identities);\n}\n\nfunction visitBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(node.value, scope, output, identities);\n visit(node.body, extended(scope, node.name), output, identities);\n}\n\nfunction visitMatch<R extends JsonValue>(\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(value, scope, output, identities);\n for (const arm of arms) {\n visit(arm.body, arm.binding ? extended(scope, arm.binding) : scope, output, identities);\n }\n}\n\nfunction addReference<R extends JsonValue>(\n reference: R,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (typeof reference === \"string\" && scope.has(reference)) return;\n const identity = canonicalJsonIdentity(reference);\n if (identities.has(identity)) return;\n identities.add(identity);\n output.push(reference);\n}\n\nfunction extended(scope: ReadonlySet<string>, name: string): ReadonlySet<string> {\n const output = new Set(scope);\n output.add(name);\n return output;\n}\n"]}
@@ -14,7 +14,12 @@ const MESSAGES = Object.freeze({
14
14
  KALADA_REFERENCE_DENIED: "Kalada reference access was denied.",
15
15
  KALADA_ASYNC_UNSUPPORTED: "Kalada callbacks must return synchronously.",
16
16
  KALADA_INVALID_RESULT: "Kalada reference callback returned an invalid value.",
17
- KALADA_EVALUATION_LIMIT: "Kalada evaluation exceeded its configured step limit."
17
+ KALADA_EVALUATION_LIMIT: "Kalada evaluation exceeded its configured step limit.",
18
+ KALADA_INSTANT_REQUIRED: "Kalada evaluation requires an explicit current Instant.",
19
+ KALADA_TEMPORAL_TYPE_MISMATCH: "Kalada temporal operation received incompatible values.",
20
+ KALADA_TEMPORAL_OVERFLOW: "Kalada temporal arithmetic exceeded safe integer milliseconds.",
21
+ KALADA_CLOCK_ERROR: "Kalada clock sampling failed.",
22
+ KALADA_INVALID_CLOCK: "Kalada clock returned an invalid Instant."
18
23
  });
19
24
  class KaladaFailure extends Error {
20
25
  code;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/diagnostics.ts"],"names":[],"mappings":";;AAEA,MAAM,QAAA,GAA6D,OAAO,MAAA,CAAO;AAAA,EAC/E,oBAAA,EAAsB,kCAAA;AAAA,EACtB,qBAAA,EAAuB,kDAAA;AAAA,EACvB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,wBAAA,EAA0B,yCAAA;AAAA,EAC1B,0BAAA,EAA4B,wCAAA;AAAA,EAC5B,wBAAA,EAA0B,uCAAA;AAAA,EAC1B,4BAAA,EAA8B,2CAAA;AAAA,EAC9B,0BAAA,EAA4B,6CAAA;AAAA,EAC5B,sBAAA,EAAwB,qCAAA;AAAA,EACxB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,uBAAA,EAAyB,qCAAA;AAAA,EACzB,wBAAA,EAA0B,6CAAA;AAAA,EAC1B,qBAAA,EAAuB,sDAAA;AAAA,EACvB,uBAAA,EAAyB;AAC3B,CAAC,CAAA;AAEM,MAAM,sBAAsB,KAAA,CAAM;AAAA,EAC9B,IAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,MAA8B,IAAA,EAAoC;AAC5E,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAEO,SAAS,OAAA,CACd,MACA,IAAA,EACoB;AACpB,EAAA,MAAM,UAAA,GAAiC,OAAO,MAAA,CAAO;AAAA,IACnD,IAAA;AAAA,IACA,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,IAAI,CAAC,CAAA;AAAA,IAC7B,OAAA,EAAS,SAAS,IAAI;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,KAAA,EAAO,YAAY,CAAA;AAChD;AAEO,SAAS,QAAW,KAAA,EAA8B;AACvD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AAC1C","file":"diagnostics.cjs","sourcesContent":["import type { KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1Outcome } from \"./types.js\";\n\nconst MESSAGES: Readonly<Record<KaladaV1DiagnosticCode, string>> = Object.freeze({\n KALADA_INVALID_INPUT: \"Kalada program input is invalid.\",\n KALADA_LIMIT_EXCEEDED: \"Kalada program input exceeds a configured limit.\",\n KALADA_INVALID_REFERENCE: \"Kalada reference is invalid.\",\n KALADA_MATCH_MISSING_ARM: \"Kalada match is missing a required arm.\",\n KALADA_MATCH_DUPLICATE_ARM: \"Kalada match contains a duplicate arm.\",\n KALADA_MATCH_UNKNOWN_ARM: \"Kalada match contains an unknown arm.\",\n KALADA_MATCH_UNREACHABLE_ARM: \"Kalada match contains an unreachable arm.\",\n KALADA_MATCH_TYPE_MISMATCH: \"Kalada match received the wrong value type.\",\n KALADA_REFERENCE_ERROR: \"Kalada reference resolution failed.\",\n KALADA_REFERENCE_MISSING: \"Kalada reference is missing.\",\n KALADA_REFERENCE_DENIED: \"Kalada reference access was denied.\",\n KALADA_ASYNC_UNSUPPORTED: \"Kalada callbacks must return synchronously.\",\n KALADA_INVALID_RESULT: \"Kalada reference callback returned an invalid value.\",\n KALADA_EVALUATION_LIMIT: \"Kalada evaluation exceeded its configured step limit.\",\n});\n\nexport class KaladaFailure extends Error {\n readonly code: KaladaV1DiagnosticCode;\n readonly path: readonly (string | number)[];\n\n constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]) {\n super(code);\n this.code = code;\n this.path = path;\n }\n}\n\nexport function failure<T>(\n code: KaladaV1DiagnosticCode,\n path: readonly (string | number)[],\n): KaladaV1Outcome<T> {\n const diagnostic: KaladaV1Diagnostic = Object.freeze({\n code,\n path: Object.freeze([...path]),\n message: MESSAGES[code],\n });\n return Object.freeze({ ok: false, diagnostic });\n}\n\nexport function success<T>(value: T): KaladaV1Outcome<T> {\n return Object.freeze({ ok: true, value });\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/diagnostics.ts"],"names":[],"mappings":";;AAEA,MAAM,QAAA,GAA6D,OAAO,MAAA,CAAO;AAAA,EAC/E,oBAAA,EAAsB,kCAAA;AAAA,EACtB,qBAAA,EAAuB,kDAAA;AAAA,EACvB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,wBAAA,EAA0B,yCAAA;AAAA,EAC1B,0BAAA,EAA4B,wCAAA;AAAA,EAC5B,wBAAA,EAA0B,uCAAA;AAAA,EAC1B,4BAAA,EAA8B,2CAAA;AAAA,EAC9B,0BAAA,EAA4B,6CAAA;AAAA,EAC5B,sBAAA,EAAwB,qCAAA;AAAA,EACxB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,uBAAA,EAAyB,qCAAA;AAAA,EACzB,wBAAA,EAA0B,6CAAA;AAAA,EAC1B,qBAAA,EAAuB,sDAAA;AAAA,EACvB,uBAAA,EAAyB,uDAAA;AAAA,EACzB,uBAAA,EAAyB,yDAAA;AAAA,EACzB,6BAAA,EAA+B,yDAAA;AAAA,EAC/B,wBAAA,EAA0B,gEAAA;AAAA,EAC1B,kBAAA,EAAoB,+BAAA;AAAA,EACpB,oBAAA,EAAsB;AACxB,CAAC,CAAA;AAEM,MAAM,sBAAsB,KAAA,CAAM;AAAA,EAC9B,IAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,MAA8B,IAAA,EAAoC;AAC5E,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAEO,SAAS,OAAA,CACd,MACA,IAAA,EACoB;AACpB,EAAA,MAAM,UAAA,GAAiC,OAAO,MAAA,CAAO;AAAA,IACnD,IAAA;AAAA,IACA,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,IAAI,CAAC,CAAA;AAAA,IAC7B,OAAA,EAAS,SAAS,IAAI;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,KAAA,EAAO,YAAY,CAAA;AAChD;AAEO,SAAS,QAAW,KAAA,EAA8B;AACvD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AAC1C","file":"diagnostics.cjs","sourcesContent":["import type { KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1Outcome } from \"./types.js\";\n\nconst MESSAGES: Readonly<Record<KaladaV1DiagnosticCode, string>> = Object.freeze({\n KALADA_INVALID_INPUT: \"Kalada program input is invalid.\",\n KALADA_LIMIT_EXCEEDED: \"Kalada program input exceeds a configured limit.\",\n KALADA_INVALID_REFERENCE: \"Kalada reference is invalid.\",\n KALADA_MATCH_MISSING_ARM: \"Kalada match is missing a required arm.\",\n KALADA_MATCH_DUPLICATE_ARM: \"Kalada match contains a duplicate arm.\",\n KALADA_MATCH_UNKNOWN_ARM: \"Kalada match contains an unknown arm.\",\n KALADA_MATCH_UNREACHABLE_ARM: \"Kalada match contains an unreachable arm.\",\n KALADA_MATCH_TYPE_MISMATCH: \"Kalada match received the wrong value type.\",\n KALADA_REFERENCE_ERROR: \"Kalada reference resolution failed.\",\n KALADA_REFERENCE_MISSING: \"Kalada reference is missing.\",\n KALADA_REFERENCE_DENIED: \"Kalada reference access was denied.\",\n KALADA_ASYNC_UNSUPPORTED: \"Kalada callbacks must return synchronously.\",\n KALADA_INVALID_RESULT: \"Kalada reference callback returned an invalid value.\",\n KALADA_EVALUATION_LIMIT: \"Kalada evaluation exceeded its configured step limit.\",\n KALADA_INSTANT_REQUIRED: \"Kalada evaluation requires an explicit current Instant.\",\n KALADA_TEMPORAL_TYPE_MISMATCH: \"Kalada temporal operation received incompatible values.\",\n KALADA_TEMPORAL_OVERFLOW: \"Kalada temporal arithmetic exceeded safe integer milliseconds.\",\n KALADA_CLOCK_ERROR: \"Kalada clock sampling failed.\",\n KALADA_INVALID_CLOCK: \"Kalada clock returned an invalid Instant.\",\n});\n\nexport class KaladaFailure extends Error {\n readonly code: KaladaV1DiagnosticCode;\n readonly path: readonly (string | number)[];\n\n constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]) {\n super(code);\n this.code = code;\n this.path = path;\n }\n}\n\nexport function failure<T>(\n code: KaladaV1DiagnosticCode,\n path: readonly (string | number)[],\n): KaladaV1Outcome<T> {\n const diagnostic: KaladaV1Diagnostic = Object.freeze({\n code,\n path: Object.freeze([...path]),\n message: MESSAGES[code],\n });\n return Object.freeze({ ok: false, diagnostic });\n}\n\nexport function success<T>(value: T): KaladaV1Outcome<T> {\n return Object.freeze({ ok: true, value });\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { KaladaV1DiagnosticCode, KaladaV1Outcome } from './types.cjs';
2
2
  import './json.cjs';
3
+ import './temporal.cjs';
3
4
  import './values.cjs';
4
5
 
5
6
  declare class KaladaFailure extends Error {
@@ -1,5 +1,6 @@
1
1
  import { KaladaV1DiagnosticCode, KaladaV1Outcome } from './types.js';
2
2
  import './json.js';
3
+ import './temporal.js';
3
4
  import './values.js';
4
5
 
5
6
  declare class KaladaFailure extends Error {
@@ -12,7 +12,12 @@ const MESSAGES = Object.freeze({
12
12
  KALADA_REFERENCE_DENIED: "Kalada reference access was denied.",
13
13
  KALADA_ASYNC_UNSUPPORTED: "Kalada callbacks must return synchronously.",
14
14
  KALADA_INVALID_RESULT: "Kalada reference callback returned an invalid value.",
15
- KALADA_EVALUATION_LIMIT: "Kalada evaluation exceeded its configured step limit."
15
+ KALADA_EVALUATION_LIMIT: "Kalada evaluation exceeded its configured step limit.",
16
+ KALADA_INSTANT_REQUIRED: "Kalada evaluation requires an explicit current Instant.",
17
+ KALADA_TEMPORAL_TYPE_MISMATCH: "Kalada temporal operation received incompatible values.",
18
+ KALADA_TEMPORAL_OVERFLOW: "Kalada temporal arithmetic exceeded safe integer milliseconds.",
19
+ KALADA_CLOCK_ERROR: "Kalada clock sampling failed.",
20
+ KALADA_INVALID_CLOCK: "Kalada clock returned an invalid Instant."
16
21
  });
17
22
  class KaladaFailure extends Error {
18
23
  code;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/diagnostics.ts"],"names":[],"mappings":"AAEA,MAAM,QAAA,GAA6D,OAAO,MAAA,CAAO;AAAA,EAC/E,oBAAA,EAAsB,kCAAA;AAAA,EACtB,qBAAA,EAAuB,kDAAA;AAAA,EACvB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,wBAAA,EAA0B,yCAAA;AAAA,EAC1B,0BAAA,EAA4B,wCAAA;AAAA,EAC5B,wBAAA,EAA0B,uCAAA;AAAA,EAC1B,4BAAA,EAA8B,2CAAA;AAAA,EAC9B,0BAAA,EAA4B,6CAAA;AAAA,EAC5B,sBAAA,EAAwB,qCAAA;AAAA,EACxB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,uBAAA,EAAyB,qCAAA;AAAA,EACzB,wBAAA,EAA0B,6CAAA;AAAA,EAC1B,qBAAA,EAAuB,sDAAA;AAAA,EACvB,uBAAA,EAAyB;AAC3B,CAAC,CAAA;AAEM,MAAM,sBAAsB,KAAA,CAAM;AAAA,EAC9B,IAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,MAA8B,IAAA,EAAoC;AAC5E,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAEO,SAAS,OAAA,CACd,MACA,IAAA,EACoB;AACpB,EAAA,MAAM,UAAA,GAAiC,OAAO,MAAA,CAAO;AAAA,IACnD,IAAA;AAAA,IACA,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,IAAI,CAAC,CAAA;AAAA,IAC7B,OAAA,EAAS,SAAS,IAAI;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,KAAA,EAAO,YAAY,CAAA;AAChD;AAEO,SAAS,QAAW,KAAA,EAA8B;AACvD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AAC1C","file":"diagnostics.js","sourcesContent":["import type { KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1Outcome } from \"./types.js\";\n\nconst MESSAGES: Readonly<Record<KaladaV1DiagnosticCode, string>> = Object.freeze({\n KALADA_INVALID_INPUT: \"Kalada program input is invalid.\",\n KALADA_LIMIT_EXCEEDED: \"Kalada program input exceeds a configured limit.\",\n KALADA_INVALID_REFERENCE: \"Kalada reference is invalid.\",\n KALADA_MATCH_MISSING_ARM: \"Kalada match is missing a required arm.\",\n KALADA_MATCH_DUPLICATE_ARM: \"Kalada match contains a duplicate arm.\",\n KALADA_MATCH_UNKNOWN_ARM: \"Kalada match contains an unknown arm.\",\n KALADA_MATCH_UNREACHABLE_ARM: \"Kalada match contains an unreachable arm.\",\n KALADA_MATCH_TYPE_MISMATCH: \"Kalada match received the wrong value type.\",\n KALADA_REFERENCE_ERROR: \"Kalada reference resolution failed.\",\n KALADA_REFERENCE_MISSING: \"Kalada reference is missing.\",\n KALADA_REFERENCE_DENIED: \"Kalada reference access was denied.\",\n KALADA_ASYNC_UNSUPPORTED: \"Kalada callbacks must return synchronously.\",\n KALADA_INVALID_RESULT: \"Kalada reference callback returned an invalid value.\",\n KALADA_EVALUATION_LIMIT: \"Kalada evaluation exceeded its configured step limit.\",\n});\n\nexport class KaladaFailure extends Error {\n readonly code: KaladaV1DiagnosticCode;\n readonly path: readonly (string | number)[];\n\n constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]) {\n super(code);\n this.code = code;\n this.path = path;\n }\n}\n\nexport function failure<T>(\n code: KaladaV1DiagnosticCode,\n path: readonly (string | number)[],\n): KaladaV1Outcome<T> {\n const diagnostic: KaladaV1Diagnostic = Object.freeze({\n code,\n path: Object.freeze([...path]),\n message: MESSAGES[code],\n });\n return Object.freeze({ ok: false, diagnostic });\n}\n\nexport function success<T>(value: T): KaladaV1Outcome<T> {\n return Object.freeze({ ok: true, value });\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/diagnostics.ts"],"names":[],"mappings":"AAEA,MAAM,QAAA,GAA6D,OAAO,MAAA,CAAO;AAAA,EAC/E,oBAAA,EAAsB,kCAAA;AAAA,EACtB,qBAAA,EAAuB,kDAAA;AAAA,EACvB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,wBAAA,EAA0B,yCAAA;AAAA,EAC1B,0BAAA,EAA4B,wCAAA;AAAA,EAC5B,wBAAA,EAA0B,uCAAA;AAAA,EAC1B,4BAAA,EAA8B,2CAAA;AAAA,EAC9B,0BAAA,EAA4B,6CAAA;AAAA,EAC5B,sBAAA,EAAwB,qCAAA;AAAA,EACxB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,uBAAA,EAAyB,qCAAA;AAAA,EACzB,wBAAA,EAA0B,6CAAA;AAAA,EAC1B,qBAAA,EAAuB,sDAAA;AAAA,EACvB,uBAAA,EAAyB,uDAAA;AAAA,EACzB,uBAAA,EAAyB,yDAAA;AAAA,EACzB,6BAAA,EAA+B,yDAAA;AAAA,EAC/B,wBAAA,EAA0B,gEAAA;AAAA,EAC1B,kBAAA,EAAoB,+BAAA;AAAA,EACpB,oBAAA,EAAsB;AACxB,CAAC,CAAA;AAEM,MAAM,sBAAsB,KAAA,CAAM;AAAA,EAC9B,IAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,MAA8B,IAAA,EAAoC;AAC5E,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAEO,SAAS,OAAA,CACd,MACA,IAAA,EACoB;AACpB,EAAA,MAAM,UAAA,GAAiC,OAAO,MAAA,CAAO;AAAA,IACnD,IAAA;AAAA,IACA,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,IAAI,CAAC,CAAA;AAAA,IAC7B,OAAA,EAAS,SAAS,IAAI;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,KAAA,EAAO,YAAY,CAAA;AAChD;AAEO,SAAS,QAAW,KAAA,EAA8B;AACvD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AAC1C","file":"diagnostics.js","sourcesContent":["import type { KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1Outcome } from \"./types.js\";\n\nconst MESSAGES: Readonly<Record<KaladaV1DiagnosticCode, string>> = Object.freeze({\n KALADA_INVALID_INPUT: \"Kalada program input is invalid.\",\n KALADA_LIMIT_EXCEEDED: \"Kalada program input exceeds a configured limit.\",\n KALADA_INVALID_REFERENCE: \"Kalada reference is invalid.\",\n KALADA_MATCH_MISSING_ARM: \"Kalada match is missing a required arm.\",\n KALADA_MATCH_DUPLICATE_ARM: \"Kalada match contains a duplicate arm.\",\n KALADA_MATCH_UNKNOWN_ARM: \"Kalada match contains an unknown arm.\",\n KALADA_MATCH_UNREACHABLE_ARM: \"Kalada match contains an unreachable arm.\",\n KALADA_MATCH_TYPE_MISMATCH: \"Kalada match received the wrong value type.\",\n KALADA_REFERENCE_ERROR: \"Kalada reference resolution failed.\",\n KALADA_REFERENCE_MISSING: \"Kalada reference is missing.\",\n KALADA_REFERENCE_DENIED: \"Kalada reference access was denied.\",\n KALADA_ASYNC_UNSUPPORTED: \"Kalada callbacks must return synchronously.\",\n KALADA_INVALID_RESULT: \"Kalada reference callback returned an invalid value.\",\n KALADA_EVALUATION_LIMIT: \"Kalada evaluation exceeded its configured step limit.\",\n KALADA_INSTANT_REQUIRED: \"Kalada evaluation requires an explicit current Instant.\",\n KALADA_TEMPORAL_TYPE_MISMATCH: \"Kalada temporal operation received incompatible values.\",\n KALADA_TEMPORAL_OVERFLOW: \"Kalada temporal arithmetic exceeded safe integer milliseconds.\",\n KALADA_CLOCK_ERROR: \"Kalada clock sampling failed.\",\n KALADA_INVALID_CLOCK: \"Kalada clock returned an invalid Instant.\",\n});\n\nexport class KaladaFailure extends Error {\n readonly code: KaladaV1DiagnosticCode;\n readonly path: readonly (string | number)[];\n\n constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]) {\n super(code);\n this.code = code;\n this.path = path;\n }\n}\n\nexport function failure<T>(\n code: KaladaV1DiagnosticCode,\n path: readonly (string | number)[],\n): KaladaV1Outcome<T> {\n const diagnostic: KaladaV1Diagnostic = Object.freeze({\n code,\n path: Object.freeze([...path]),\n message: MESSAGES[code],\n });\n return Object.freeze({ ok: false, diagnostic });\n}\n\nexport function success<T>(value: T): KaladaV1Outcome<T> {\n return Object.freeze({ ok: true, value });\n}\n"]}
@@ -3,12 +3,15 @@
3
3
  var callbackPromise_js = require('../kuery-v1/callback-promise.js');
4
4
  var diagnostics_js = require('./diagnostics.js');
5
5
  var json_js = require('./json.js');
6
+ var temporal_js = require('./temporal.js');
7
+ var temporalEvaluation_js = require('./temporal-evaluation.js');
6
8
  var values_js = require('./values.js');
7
9
 
8
- function evaluateKaladaV1(expression, resolve, limits) {
10
+ function evaluateKaladaV1(expression, resolve, limits, inputs = {}) {
9
11
  try {
12
+ const instant = evaluationInstant(inputs);
10
13
  return diagnostics_js.success(
11
- evaluateNode(expression, ["expression"], /* @__PURE__ */ new Map(), { resolve, limits, steps: 0 })
14
+ evaluateNode(expression, ["expression"], /* @__PURE__ */ new Map(), { resolve, limits, instant, steps: 0 })
12
15
  );
13
16
  } catch (error) {
14
17
  const problem = error instanceof diagnostics_js.KaladaFailure ? error : new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", []);
@@ -18,6 +21,14 @@ function evaluateKaladaV1(expression, resolve, limits) {
18
21
  function evaluateNode(node, path, scope, state) {
19
22
  charge(path, state);
20
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
+ }
21
32
  if (node.kind === "ref") return evaluateReference(node.ref, path, scope, state);
22
33
  if (node.kind === "binding") return evaluateBinding(node, path, scope, state);
23
34
  if (node.kind === "option") {
@@ -29,6 +40,30 @@ function evaluateNode(node, path, scope, state) {
29
40
  }
30
41
  return evaluateMatch(node, path, scope, state);
31
42
  }
43
+ function evaluationInstant(inputs) {
44
+ let keys;
45
+ try {
46
+ if (typeof inputs !== "object" || inputs === null || Array.isArray(inputs))
47
+ throw new TypeError();
48
+ keys = Reflect.ownKeys(inputs);
49
+ } catch {
50
+ throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
51
+ }
52
+ const unexpected = keys.find((key) => key !== "instant");
53
+ if (unexpected !== void 0)
54
+ throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", String(unexpected)]);
55
+ if (!keys.includes("instant")) return void 0;
56
+ let instant;
57
+ try {
58
+ instant = json_js.dataValue(inputs, "instant");
59
+ } catch {
60
+ throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
61
+ }
62
+ if (instant !== void 0 && !temporal_js.isInstant(instant)) {
63
+ throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
64
+ }
65
+ return instant;
66
+ }
32
67
  function evaluateBinding(node, path, scope, state) {
33
68
  const value = evaluateNode(node.value, [...path, "value"], scope, state);
34
69
  const nested = new Map(scope);
@@ -97,7 +132,7 @@ function missingResolution(input, keys, path) {
97
132
  }
98
133
  function safeValue(input, path, limits) {
99
134
  try {
100
- if (values_js.isOption(input) || values_js.isResult(input)) {
135
+ if (values_js.isOption(input) || values_js.isResult(input) || temporal_js.isInstant(input) || temporal_js.isDuration(input)) {
101
136
  values_js.validateKaladaValueLimits(input, {
102
137
  maxDepth: limits.maxValueDepth,
103
138
  maxNodes: limits.maxValueNodes,
@@ -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","KaladaFailure","failure","isTemporalExpression","evaluateTemporalExpression","Option","Result","dataValue","isInstant","isOption","isResult","rejectCallbackPromise","isDuration","validateKaladaValueLimits","cloneJson"],"mappings":";;;;;;;;;AA8BO,SAAS,iBACd,UAAA,EACA,OAAA,EACA,MAAA,EACA,MAAA,GAAmC,EAAC,EACN;AAC9B,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,kBAAkB,MAAM,CAAA;AACxC,IAAA,OAAOA,sBAAA;AAAA,MACL,YAAA,CAAa,UAAA,EAAY,CAAC,YAAY,mBAAG,IAAI,GAAA,EAAI,EAAG,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,GAAG;AAAA,KAC5F;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GACJ,iBAAiBC,4BAAA,GAAgB,KAAA,GAAQ,IAAIA,4BAAA,CAAc,wBAAA,EAA0B,EAAE,CAAA;AACzF,IAAA,OAAOC,sBAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC3C;AACF;AAEA,SAAS,YAAA,CACP,IAAA,EACA,IAAA,EACA,KAAA,EACA,KAAA,EACa;AACb,EAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAClB,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW,OAAO,IAAA,CAAK,KAAA;AACzC,EAAA,IAAIC,0CAAA,CAAqB,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAOC,gDAAA;AAAA,MAA2B,IAAA;AAAA,MAAM,IAAA;AAAA,MAAM,KAAA,CAAM,OAAA;AAAA,MAAS,CAAC,KAAA,EAAO,SAAA,KACnE,aAAa,KAAA,EAAO,SAAA,EAAW,OAAO,KAAK;AAAA,KAC7C;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO,OAAO,kBAAkB,IAAA,CAAK,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA;AAC9E,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW,OAAO,gBAAgB,IAAA,EAAM,IAAA,EAAM,OAAO,KAAK,CAAA;AAC5E,EAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,IAAA,OAAO,KAAK,OAAA,KAAY,MAAA,GACpBC,iBAAO,IAAA,EAAK,GACZA,iBAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,CAAC,GAAG,IAAA,EAAM,OAAO,CAAA,EAAG,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,EAC5E;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,CAAC,GAAG,IAAA,EAAM,OAAO,CAAA,EAAG,KAAA,EAAO,KAAK,CAAA;AACvE,IAAA,OAAO,IAAA,CAAK,YAAY,IAAA,GAAOC,gBAAA,CAAO,GAAG,KAAK,CAAA,GAAIA,gBAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,aAAA,CAAc,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA;AAC/C;AAEA,SAAS,kBAAkB,MAAA,EAA+D;AACxF,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,IAAIL,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,UAAA,KAAe,MAAA;AACjB,IAAA,MAAM,IAAIA,6BAAc,sBAAA,EAAwB,CAAC,UAAU,MAAA,CAAO,UAAU,CAAC,CAAC,CAAA;AAChF,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,SAAS,GAAG,OAAO,MAAA;AACtC,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAUM,iBAAA,CAAU,QAAQ,SAAS,CAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIN,4BAAA,CAAc,sBAAA,EAAwB,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,CAACO,qBAAA,CAAU,OAAO,CAAA,EAAG;AAChD,IAAA,MAAM,IAAIP,4BAAA,CAAc,sBAAA,EAAwB,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,eAAA,CACP,IAAA,EACA,IAAA,EACA,KAAA,EACA,KAAA,EACa;AACb,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,CAAC,GAAG,IAAA,EAAM,OAAO,CAAA,EAAG,KAAA,EAAO,KAAK,CAAA;AACvE,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,KAAK,CAAA;AAC5B,EAAA,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC3B,EAAA,OAAO,YAAA,CAAa,KAAK,IAAA,EAAM,CAAC,GAAG,IAAA,EAAM,MAAM,CAAA,EAAG,MAAA,EAAQ,KAAK,CAAA;AACjE;AAEA,SAAS,aAAA,CACP,IAAA,EACA,IAAA,EACA,KAAA,EACA,KAAA,EACa;AACb,EAAA,MAAM,SAAA,GAAY,CAAC,GAAG,IAAA,EAAM,OAAO,CAAA;AACnC,EAAA,MAAM,QAAQ,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,SAAA,EAAW,OAAO,KAAK,CAAA;AAC9D,EAAA,IAAI,KAAK,IAAA,KAAS,QAAA,IAAY,CAACQ,kBAAA,CAAS,KAAK,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAIR,4BAAA,CAAc,4BAAA,EAA8B,SAAS,CAAA;AAAA,EACjE;AACA,EAAA,IAAI,KAAK,IAAA,KAAS,QAAA,IAAY,CAACS,kBAAA,CAAS,KAAK,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAIT,4BAAA,CAAc,4BAAA,EAA8B,SAAS,CAAA;AAAA,EACjE;AACA,EAAA,IAAI,CAACQ,kBAAA,CAAS,KAAK,KAAK,CAACC,kBAAA,CAAS,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,IAAIT,4BAAA,CAAc,4BAAA,EAA8B,SAAS,CAAA;AAAA,EACjE;AACA,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,SAAA,CAAU,CAAC,SAAA,KAAc,SAAA,CAAU,YAAY,OAAO,CAAA;AACjF,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC9B,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAIA,4BAAA,CAAc,wBAAwB,CAAC,GAAG,IAAA,EAAM,MAAM,CAAC,CAAA;AAC3E,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,KAAA,EAAO,GAAA,EAAK,KAAK,CAAA;AAC5C,EAAA,OAAO,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,CAAC,GAAG,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA,EAAG,MAAA,EAAQ,KAAK,CAAA;AAClF;AAEA,SAAS,WAAA,CACP,KAAA,EACA,GAAA,EACA,KAAA,EACkC;AAClC,EAAA,IAAI,CAAC,GAAA,CAAI,OAAA,IAAY,CAACQ,kBAAA,CAAS,KAAK,CAAA,IAAK,CAACC,kBAAA,CAAS,KAAK,CAAA,IAAM,KAAA,CAAM,OAAA,KAAY,MAAA;AAC9E,IAAA,OAAO,KAAA;AACT,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,KAAK,CAAA;AAC5B,EAAA,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA;AACnC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAA,CACP,SAAA,EACA,IAAA,EACA,KAAA,EACA,KAAA,EACa;AACb,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,KAAA,CAAM,IAAI,SAAS,CAAA;AACtD,IAAA,OAAO,KAAA,CAAM,IAAI,SAAS,CAAA;AAC5B,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,KAAA,CAAM,QAAQ,SAAS,CAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIT,4BAAA,CAAc,wBAAA,EAA0B,IAAI,CAAA;AAAA,EACxD;AACA,EAAA,IAAIU,yCAAsB,KAAK,CAAA,QAAS,IAAIV,4BAAA,CAAc,4BAA4B,IAAI,CAAA;AAC1F,EAAA,OAAO,eAAA,CAAgB,KAAA,EAAO,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AAClD;AAEA,SAAS,eAAA,CAAgB,KAAA,EAAgB,IAAA,EAAY,MAAA,EAAqC;AACxF,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,IAAA,MAAM,IAAIA,4BAAA,CAAc,wBAAA,EAA0B,IAAI,CAAA;AAAA,EACxD;AACA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,EAAO,OAAA,EAAS,IAAI,CAAA;AAC3C,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,QAAiB,IAAIA,4BAAA,CAAc,0BAA0B,IAAI,CAAA;AACtF,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,iBAAA,CAAkB,KAAA,EAAO,MAAM,IAAI,CAAA;AACtD,EAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,CAAC,IAAA,CAAK,SAAS,OAAO,CAAA;AAC7C,IAAA,MAAM,IAAIA,4BAAA,CAAc,wBAAA,EAA0B,IAAI,CAAA;AACxD,EAAA,OAAO,UAAU,QAAA,CAAS,KAAA,EAAO,SAAS,IAAI,CAAA,EAAG,MAAM,MAAM,CAAA;AAC/D;AAEA,SAAS,iBAAA,CAAkB,KAAA,EAAe,IAAA,EAA8B,IAAA,EAAmB;AACzF,EAAA,IAAI,KAAK,MAAA,KAAW,CAAA,QAAS,IAAIA,4BAAA,CAAc,4BAA4B,IAAI,CAAA;AAC/E,EAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,CAAC,IAAA,CAAK,SAAS,QAAQ,CAAA;AAC9C,IAAA,MAAM,IAAIA,4BAAA,CAAc,wBAAA,EAA0B,IAAI,CAAA;AACxD,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,EAAO,QAAA,EAAU,IAAI,CAAA;AAC7C,EAAA,IAAI,MAAA,KAAW,UAAa,MAAA,KAAW,SAAA;AACrC,IAAA,MAAM,IAAIA,4BAAA,CAAc,0BAAA,EAA4B,IAAI,CAAA;AAC1D,EAAA,IAAI,WAAW,QAAA,EAAU,MAAM,IAAIA,4BAAA,CAAc,2BAA2B,IAAI,CAAA;AAChF,EAAA,MAAM,IAAIA,4BAAA,CAAc,wBAAA,EAA0B,IAAI,CAAA;AACxD;AAEA,SAAS,SAAA,CAAU,KAAA,EAAgB,IAAA,EAAY,MAAA,EAAqC;AAClF,EAAA,IAAI;AACF,IAAA,IAAIQ,kBAAA,CAAS,KAAK,CAAA,IAAKC,kBAAA,CAAS,KAAK,CAAA,IAAKF,qBAAA,CAAU,KAAK,CAAA,IAAKI,sBAAA,CAAW,KAAK,CAAA,EAAG;AAC/E,MAAAC,mCAAA,CAA0B,KAAA,EAAO;AAAA,QAC/B,UAAU,MAAA,CAAO,aAAA;AAAA,QACjB,UAAU,MAAA,CAAO,aAAA;AAAA,QACjB,iBAAiB,MAAA,CAAO;AAAA,OACzB,CAAA;AACD,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAOC,kBAAU,KAAA,EAAO;AAAA,MACtB,UAAU,MAAA,CAAO,aAAA;AAAA,MACjB,UAAU,MAAA,CAAO,aAAA;AAAA,MACjB,iBAAiB,MAAA,CAAO;AAAA,KACzB,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,UAAA,EAAY,MAAM,IAAIb,4BAAA,CAAc,yBAAyB,IAAI,CAAA;AACtF,IAAA,MAAM,IAAIA,4BAAA,CAAc,uBAAA,EAAyB,IAAI,CAAA;AAAA,EACvD;AACF;AAEA,SAAS,QAAA,CAAS,OAAe,IAAA,EAA2B;AAC1D,EAAA,IAAI;AACF,IAAA,OAAO,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIA,4BAAA,CAAc,wBAAA,EAA0B,IAAI,CAAA;AAAA,EACxD;AACF;AAEA,SAAS,QAAA,CAAS,KAAA,EAAe,GAAA,EAAa,IAAA,EAAqB;AACjE,EAAA,IAAI;AACF,IAAA,OAAOM,iBAAA,CAAU,OAAO,GAAG,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAIN,4BAAA,CAAc,wBAAA,EAA0B,IAAI,CAAA;AAAA,EACxD;AACF;AAEA,SAAS,MAAA,CAA4B,MAAY,KAAA,EAAuB;AACtE,EAAA,KAAA,CAAM,KAAA,IAAS,CAAA;AACf,EAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,kBAAA,EAAoB;AACjD,IAAA,MAAM,IAAIA,4BAAA,CAAc,yBAAA,EAA2B,IAAI,CAAA;AAAA,EACzD;AACF","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,7 +1,8 @@
1
1
  import { JsonValue } from './json.cjs';
2
- import { KaladaV1Expression, KaladaV1Resolver, KaladaV1Limits, KaladaV1Outcome } from './types.cjs';
2
+ import { KaladaV1Expression, KaladaV1Resolver, KaladaV1Limits, KaladaV1EvaluationInputs, KaladaV1Outcome } from './types.cjs';
3
3
  import { KaladaValue } from './values.cjs';
4
+ import './temporal.cjs';
4
5
 
5
- declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: KaladaV1Limits): KaladaV1Outcome<KaladaValue>;
6
+ declare function evaluateKaladaV1<R extends JsonValue>(expression: KaladaV1Expression<R>, resolve: KaladaV1Resolver<R>, limits: KaladaV1Limits, inputs?: KaladaV1EvaluationInputs): KaladaV1Outcome<KaladaValue>;
6
7
 
7
8
  export { evaluateKaladaV1 };