@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,7 +1,8 @@
1
1
  import { JsonValue } from './json.js';
2
- import { KaladaV1Expression, KaladaV1Resolver, KaladaV1Limits, KaladaV1Outcome } from './types.js';
2
+ import { KaladaV1Expression, KaladaV1Resolver, KaladaV1Limits, KaladaV1EvaluationInputs, KaladaV1Outcome } from './types.js';
3
3
  import { KaladaValue } from './values.js';
4
+ import './temporal.js';
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 };
@@ -1,12 +1,15 @@
1
1
  import { rejectCallbackPromise } from '../kuery-v1/callback-promise.js';
2
2
  import { success, KaladaFailure, failure } from './diagnostics.js';
3
- import { cloneJson, dataValue } from './json.js';
3
+ import { dataValue, cloneJson } from './json.js';
4
+ import { isInstant, isDuration } from './temporal.js';
5
+ import { isTemporalExpression, evaluateTemporalExpression } from './temporal-evaluation.js';
4
6
  import { Option, Result, isOption, isResult, validateKaladaValueLimits } from './values.js';
5
7
 
6
- function evaluateKaladaV1(expression, resolve, limits) {
8
+ function evaluateKaladaV1(expression, resolve, limits, inputs = {}) {
7
9
  try {
10
+ const instant = evaluationInstant(inputs);
8
11
  return success(
9
- evaluateNode(expression, ["expression"], /* @__PURE__ */ new Map(), { resolve, limits, steps: 0 })
12
+ evaluateNode(expression, ["expression"], /* @__PURE__ */ new Map(), { resolve, limits, instant, steps: 0 })
10
13
  );
11
14
  } catch (error) {
12
15
  const problem = error instanceof KaladaFailure ? error : new KaladaFailure("KALADA_REFERENCE_ERROR", []);
@@ -16,6 +19,14 @@ function evaluateKaladaV1(expression, resolve, limits) {
16
19
  function evaluateNode(node, path, scope, state) {
17
20
  charge(path, state);
18
21
  if (node.kind === "literal") return node.value;
22
+ if (isTemporalExpression(node)) {
23
+ return evaluateTemporalExpression(
24
+ node,
25
+ path,
26
+ state.instant,
27
+ (child, childPath) => evaluateNode(child, childPath, scope, state)
28
+ );
29
+ }
19
30
  if (node.kind === "ref") return evaluateReference(node.ref, path, scope, state);
20
31
  if (node.kind === "binding") return evaluateBinding(node, path, scope, state);
21
32
  if (node.kind === "option") {
@@ -27,6 +38,30 @@ function evaluateNode(node, path, scope, state) {
27
38
  }
28
39
  return evaluateMatch(node, path, scope, state);
29
40
  }
41
+ function evaluationInstant(inputs) {
42
+ let keys;
43
+ try {
44
+ if (typeof inputs !== "object" || inputs === null || Array.isArray(inputs))
45
+ throw new TypeError();
46
+ keys = Reflect.ownKeys(inputs);
47
+ } catch {
48
+ throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
49
+ }
50
+ const unexpected = keys.find((key) => key !== "instant");
51
+ if (unexpected !== void 0)
52
+ throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", String(unexpected)]);
53
+ if (!keys.includes("instant")) return void 0;
54
+ let instant;
55
+ try {
56
+ instant = dataValue(inputs, "instant");
57
+ } catch {
58
+ throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
59
+ }
60
+ if (instant !== void 0 && !isInstant(instant)) {
61
+ throw new KaladaFailure("KALADA_INVALID_INPUT", ["inputs", "instant"]);
62
+ }
63
+ return instant;
64
+ }
30
65
  function evaluateBinding(node, path, scope, state) {
31
66
  const value = evaluateNode(node.value, [...path, "value"], scope, state);
32
67
  const nested = new Map(scope);
@@ -95,7 +130,7 @@ function missingResolution(input, keys, path) {
95
130
  }
96
131
  function safeValue(input, path, limits) {
97
132
  try {
98
- if (isOption(input) || isResult(input)) {
133
+ if (isOption(input) || isResult(input) || isInstant(input) || isDuration(input)) {
99
134
  validateKaladaValueLimits(input, {
100
135
  maxDepth: limits.maxValueDepth,
101
136
  maxNodes: limits.maxValueNodes,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/evaluate.ts"],"names":[],"mappings":"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","file":"evaluate.js","sourcesContent":["import { rejectCallbackPromise } from \"../kuery-v1/callback-promise.js\";\nimport { failure, KaladaFailure, success } from \"./diagnostics.js\";\nimport { cloneJson, dataValue, type JsonValue } from \"./json.js\";\nimport type {\n KaladaV1Expression,\n KaladaV1Limits,\n KaladaV1Outcome,\n KaladaV1Resolver,\n MatchArm,\n} from \"./types.js\";\nimport {\n isOption,\n isResult,\n type KaladaValue,\n Option,\n Result,\n validateKaladaValueLimits,\n} from \"./values.js\";\n\ntype Path = readonly (string | number)[];\ninterface State<R extends JsonValue> {\n readonly resolve: KaladaV1Resolver<R>;\n readonly limits: KaladaV1Limits;\n steps: number;\n}\n\nexport function evaluateKaladaV1<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n resolve: KaladaV1Resolver<R>,\n limits: KaladaV1Limits,\n): KaladaV1Outcome<KaladaValue> {\n try {\n return success(\n evaluateNode(expression, [\"expression\"], new Map(), { resolve, limits, steps: 0 }),\n );\n } catch (error) {\n const problem =\n error instanceof KaladaFailure ? error : new KaladaFailure(\"KALADA_REFERENCE_ERROR\", []);\n return failure(problem.code, problem.path);\n }\n}\n\nfunction evaluateNode<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n charge(path, state);\n if (node.kind === \"literal\") return node.value;\n if (node.kind === \"ref\") return evaluateReference(node.ref, path, scope, state);\n if (node.kind === \"binding\") return evaluateBinding(node, path, scope, state);\n if (node.kind === \"option\") {\n return node.variant === \"none\"\n ? Option.none()\n : Option.some(evaluateNode(node.value, [...path, \"value\"], scope, state));\n }\n if (node.kind === \"result\") {\n const value = evaluateNode(node.value, [...path, \"value\"], scope, state);\n return node.variant === \"ok\" ? Result.ok(value) : Result.err(value);\n }\n return evaluateMatch(node, path, scope, state);\n}\n\nfunction evaluateBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n const value = evaluateNode(node.value, [...path, \"value\"], scope, state);\n const nested = new Map(scope);\n nested.set(node.name, value);\n return evaluateNode(node.body, [...path, \"body\"], nested, state);\n}\n\nfunction evaluateMatch<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"match\" }>,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n const valuePath = [...path, \"value\"];\n const value = evaluateNode(node.value, valuePath, scope, state);\n if (node.type === \"Option\" && !isOption(value)) {\n throw new KaladaFailure(\"KALADA_MATCH_TYPE_MISMATCH\", valuePath);\n }\n if (node.type === \"Result\" && !isResult(value)) {\n throw new KaladaFailure(\"KALADA_MATCH_TYPE_MISMATCH\", valuePath);\n }\n if (!isOption(value) && !isResult(value)) {\n throw new KaladaFailure(\"KALADA_MATCH_TYPE_MISMATCH\", valuePath);\n }\n const variant = value.variant;\n const armIndex = node.arms.findIndex((candidate) => candidate.variant === variant);\n const arm = node.arms[armIndex];\n if (!arm) throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"arms\"]);\n const nested = bindPayload(scope, arm, value);\n return evaluateNode(arm.body, [...path, \"arms\", armIndex, \"body\"], nested, state);\n}\n\nfunction bindPayload(\n scope: ReadonlyMap<string, KaladaValue>,\n arm: MatchArm<JsonValue>,\n value: KaladaValue,\n): ReadonlyMap<string, KaladaValue> {\n if (!arm.binding || (!isOption(value) && !isResult(value)) || value.variant === \"none\")\n return scope;\n const nested = new Map(scope);\n nested.set(arm.binding, value.value);\n return nested;\n}\n\nfunction evaluateReference<R extends JsonValue>(\n reference: R,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n if (typeof reference === \"string\" && scope.has(reference))\n return scope.get(reference) as KaladaValue;\n let input: unknown;\n try {\n input = state.resolve(reference);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n if (rejectCallbackPromise(input)) throw new KaladaFailure(\"KALADA_ASYNC_UNSUPPORTED\", path);\n return parseResolution(input, path, state.limits);\n}\n\nfunction parseResolution(input: unknown, path: Path, limits: KaladaV1Limits): KaladaValue {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n const keys = safeKeys(input, path);\n const found = safeData(input, \"found\", path);\n if (typeof found !== \"boolean\") throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n if (!found) return missingResolution(input, keys, path);\n if (keys.length !== 2 || !keys.includes(\"value\"))\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n return safeValue(safeData(input, \"value\", path), path, limits);\n}\n\nfunction missingResolution(input: object, keys: readonly PropertyKey[], path: Path): never {\n if (keys.length === 1) throw new KaladaFailure(\"KALADA_REFERENCE_MISSING\", path);\n if (keys.length !== 2 || !keys.includes(\"reason\"))\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n const reason = safeData(input, \"reason\", path);\n if (reason === undefined || reason === \"missing\")\n throw new KaladaFailure(\"KALADA_REFERENCE_MISSING\", path);\n if (reason === \"denied\") throw new KaladaFailure(\"KALADA_REFERENCE_DENIED\", path);\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n}\n\nfunction safeValue(input: unknown, path: Path, limits: KaladaV1Limits): KaladaValue {\n try {\n if (isOption(input) || isResult(input)) {\n validateKaladaValueLimits(input, {\n maxDepth: limits.maxValueDepth,\n maxNodes: limits.maxValueNodes,\n maxStringLength: limits.maxStringLength,\n });\n return input;\n }\n return cloneJson(input, {\n maxDepth: limits.maxValueDepth,\n maxNodes: limits.maxValueNodes,\n maxStringLength: limits.maxStringLength,\n });\n } catch (error) {\n if (error instanceof RangeError) throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n throw new KaladaFailure(\"KALADA_INVALID_RESULT\", path);\n }\n}\n\nfunction safeKeys(input: object, path: Path): PropertyKey[] {\n try {\n return Reflect.ownKeys(input);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n}\n\nfunction safeData(input: object, key: string, path: Path): unknown {\n try {\n return dataValue(input, key);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n}\n\nfunction charge<R extends JsonValue>(path: Path, state: State<R>): void {\n state.steps += 1;\n if (state.steps > state.limits.maxEvaluationSteps) {\n throw new KaladaFailure(\"KALADA_EVALUATION_LIMIT\", path);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/evaluate.ts"],"names":[],"mappings":";;;;;;;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,OAAO,OAAA;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,iBAAiB,aAAA,GAAgB,KAAA,GAAQ,IAAI,aAAA,CAAc,wBAAA,EAA0B,EAAE,CAAA;AACzF,IAAA,OAAO,OAAA,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,IAAI,oBAAA,CAAqB,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAO,0BAAA;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,GACpB,OAAO,IAAA,EAAK,GACZ,OAAO,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,GAAO,MAAA,CAAO,GAAG,KAAK,CAAA,GAAI,MAAA,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,IAAI,aAAA,CAAc,sBAAA,EAAwB,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,MAAM,aAAa,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,QAAQ,SAAS,CAAA;AACvD,EAAA,IAAI,UAAA,KAAe,MAAA;AACjB,IAAA,MAAM,IAAI,cAAc,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,GAAU,SAAA,CAAU,QAAQ,SAAS,CAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,aAAA,CAAc,sBAAA,EAAwB,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,CAAC,SAAA,CAAU,OAAO,CAAA,EAAG;AAChD,IAAA,MAAM,IAAI,aAAA,CAAc,sBAAA,EAAwB,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,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,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAI,aAAA,CAAc,4BAAA,EAA8B,SAAS,CAAA;AAAA,EACjE;AACA,EAAA,IAAI,KAAK,IAAA,KAAS,QAAA,IAAY,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAI,aAAA,CAAc,4BAAA,EAA8B,SAAS,CAAA;AAAA,EACjE;AACA,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,KAAK,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,aAAA,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,IAAI,aAAA,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,CAAC,QAAA,CAAS,KAAK,CAAA,IAAK,CAAC,QAAA,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,IAAI,aAAA,CAAc,wBAAA,EAA0B,IAAI,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,sBAAsB,KAAK,CAAA,QAAS,IAAI,aAAA,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,IAAI,aAAA,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,IAAI,aAAA,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,IAAI,aAAA,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,IAAI,aAAA,CAAc,4BAA4B,IAAI,CAAA;AAC/E,EAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,CAAC,IAAA,CAAK,SAAS,QAAQ,CAAA;AAC9C,IAAA,MAAM,IAAI,aAAA,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,IAAI,aAAA,CAAc,0BAAA,EAA4B,IAAI,CAAA;AAC1D,EAAA,IAAI,WAAW,QAAA,EAAU,MAAM,IAAI,aAAA,CAAc,2BAA2B,IAAI,CAAA;AAChF,EAAA,MAAM,IAAI,aAAA,CAAc,wBAAA,EAA0B,IAAI,CAAA;AACxD;AAEA,SAAS,SAAA,CAAU,KAAA,EAAgB,IAAA,EAAY,MAAA,EAAqC;AAClF,EAAA,IAAI;AACF,IAAA,IAAI,QAAA,CAAS,KAAK,CAAA,IAAK,QAAA,CAAS,KAAK,CAAA,IAAK,SAAA,CAAU,KAAK,CAAA,IAAK,UAAA,CAAW,KAAK,CAAA,EAAG;AAC/E,MAAA,yBAAA,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,OAAO,UAAU,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,IAAI,aAAA,CAAc,yBAAyB,IAAI,CAAA;AACtF,IAAA,MAAM,IAAI,aAAA,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,IAAI,aAAA,CAAc,wBAAA,EAA0B,IAAI,CAAA;AAAA,EACxD;AACF;AAEA,SAAS,QAAA,CAAS,KAAA,EAAe,GAAA,EAAa,IAAA,EAAqB;AACjE,EAAA,IAAI;AACF,IAAA,OAAO,SAAA,CAAU,OAAO,GAAG,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,aAAA,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,IAAI,aAAA,CAAc,yBAAA,EAA2B,IAAI,CAAA;AAAA,EACzD;AACF","file":"evaluate.js","sourcesContent":["import { rejectCallbackPromise } from \"../kuery-v1/callback-promise.js\";\nimport { failure, KaladaFailure, success } from \"./diagnostics.js\";\nimport { cloneJson, dataValue, type JsonValue } from \"./json.js\";\nimport { type InstantValue, isDuration, isInstant } from \"./temporal.js\";\nimport { evaluateTemporalExpression, isTemporalExpression } from \"./temporal-evaluation.js\";\nimport type {\n KaladaV1EvaluationInputs,\n KaladaV1Expression,\n KaladaV1Limits,\n KaladaV1Outcome,\n KaladaV1Resolver,\n MatchArm,\n} from \"./types.js\";\nimport {\n isOption,\n isResult,\n type KaladaValue,\n Option,\n Result,\n validateKaladaValueLimits,\n} from \"./values.js\";\n\ntype Path = readonly (string | number)[];\ninterface State<R extends JsonValue> {\n readonly resolve: KaladaV1Resolver<R>;\n readonly limits: KaladaV1Limits;\n readonly instant?: InstantValue;\n steps: number;\n}\n\nexport function evaluateKaladaV1<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n resolve: KaladaV1Resolver<R>,\n limits: KaladaV1Limits,\n inputs: KaladaV1EvaluationInputs = {},\n): KaladaV1Outcome<KaladaValue> {\n try {\n const instant = evaluationInstant(inputs);\n return success(\n evaluateNode(expression, [\"expression\"], new Map(), { resolve, limits, instant, steps: 0 }),\n );\n } catch (error) {\n const problem =\n error instanceof KaladaFailure ? error : new KaladaFailure(\"KALADA_REFERENCE_ERROR\", []);\n return failure(problem.code, problem.path);\n }\n}\n\nfunction evaluateNode<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n charge(path, state);\n if (node.kind === \"literal\") return node.value;\n if (isTemporalExpression(node)) {\n return evaluateTemporalExpression(node, path, state.instant, (child, childPath) =>\n evaluateNode(child, childPath, scope, state),\n );\n }\n if (node.kind === \"ref\") return evaluateReference(node.ref, path, scope, state);\n if (node.kind === \"binding\") return evaluateBinding(node, path, scope, state);\n if (node.kind === \"option\") {\n return node.variant === \"none\"\n ? Option.none()\n : Option.some(evaluateNode(node.value, [...path, \"value\"], scope, state));\n }\n if (node.kind === \"result\") {\n const value = evaluateNode(node.value, [...path, \"value\"], scope, state);\n return node.variant === \"ok\" ? Result.ok(value) : Result.err(value);\n }\n return evaluateMatch(node, path, scope, state);\n}\n\nfunction evaluationInstant(inputs: KaladaV1EvaluationInputs): State<JsonValue>[\"instant\"] {\n let keys: readonly PropertyKey[];\n try {\n if (typeof inputs !== \"object\" || inputs === null || Array.isArray(inputs))\n throw new TypeError();\n keys = Reflect.ownKeys(inputs);\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", \"instant\"]);\n }\n const unexpected = keys.find((key) => key !== \"instant\");\n if (unexpected !== undefined)\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", String(unexpected)]);\n if (!keys.includes(\"instant\")) return undefined;\n let instant: unknown;\n try {\n instant = dataValue(inputs, \"instant\");\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", \"instant\"]);\n }\n if (instant !== undefined && !isInstant(instant)) {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [\"inputs\", \"instant\"]);\n }\n return instant;\n}\n\nfunction evaluateBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n const value = evaluateNode(node.value, [...path, \"value\"], scope, state);\n const nested = new Map(scope);\n nested.set(node.name, value);\n return evaluateNode(node.body, [...path, \"body\"], nested, state);\n}\n\nfunction evaluateMatch<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"match\" }>,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n const valuePath = [...path, \"value\"];\n const value = evaluateNode(node.value, valuePath, scope, state);\n if (node.type === \"Option\" && !isOption(value)) {\n throw new KaladaFailure(\"KALADA_MATCH_TYPE_MISMATCH\", valuePath);\n }\n if (node.type === \"Result\" && !isResult(value)) {\n throw new KaladaFailure(\"KALADA_MATCH_TYPE_MISMATCH\", valuePath);\n }\n if (!isOption(value) && !isResult(value)) {\n throw new KaladaFailure(\"KALADA_MATCH_TYPE_MISMATCH\", valuePath);\n }\n const variant = value.variant;\n const armIndex = node.arms.findIndex((candidate) => candidate.variant === variant);\n const arm = node.arms[armIndex];\n if (!arm) throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"arms\"]);\n const nested = bindPayload(scope, arm, value);\n return evaluateNode(arm.body, [...path, \"arms\", armIndex, \"body\"], nested, state);\n}\n\nfunction bindPayload(\n scope: ReadonlyMap<string, KaladaValue>,\n arm: MatchArm<JsonValue>,\n value: KaladaValue,\n): ReadonlyMap<string, KaladaValue> {\n if (!arm.binding || (!isOption(value) && !isResult(value)) || value.variant === \"none\")\n return scope;\n const nested = new Map(scope);\n nested.set(arm.binding, value.value);\n return nested;\n}\n\nfunction evaluateReference<R extends JsonValue>(\n reference: R,\n path: Path,\n scope: ReadonlyMap<string, KaladaValue>,\n state: State<R>,\n): KaladaValue {\n if (typeof reference === \"string\" && scope.has(reference))\n return scope.get(reference) as KaladaValue;\n let input: unknown;\n try {\n input = state.resolve(reference);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n if (rejectCallbackPromise(input)) throw new KaladaFailure(\"KALADA_ASYNC_UNSUPPORTED\", path);\n return parseResolution(input, path, state.limits);\n}\n\nfunction parseResolution(input: unknown, path: Path, limits: KaladaV1Limits): KaladaValue {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n const keys = safeKeys(input, path);\n const found = safeData(input, \"found\", path);\n if (typeof found !== \"boolean\") throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n if (!found) return missingResolution(input, keys, path);\n if (keys.length !== 2 || !keys.includes(\"value\"))\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n return safeValue(safeData(input, \"value\", path), path, limits);\n}\n\nfunction missingResolution(input: object, keys: readonly PropertyKey[], path: Path): never {\n if (keys.length === 1) throw new KaladaFailure(\"KALADA_REFERENCE_MISSING\", path);\n if (keys.length !== 2 || !keys.includes(\"reason\"))\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n const reason = safeData(input, \"reason\", path);\n if (reason === undefined || reason === \"missing\")\n throw new KaladaFailure(\"KALADA_REFERENCE_MISSING\", path);\n if (reason === \"denied\") throw new KaladaFailure(\"KALADA_REFERENCE_DENIED\", path);\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n}\n\nfunction safeValue(input: unknown, path: Path, limits: KaladaV1Limits): KaladaValue {\n try {\n if (isOption(input) || isResult(input) || isInstant(input) || isDuration(input)) {\n validateKaladaValueLimits(input, {\n maxDepth: limits.maxValueDepth,\n maxNodes: limits.maxValueNodes,\n maxStringLength: limits.maxStringLength,\n });\n return input;\n }\n return cloneJson(input, {\n maxDepth: limits.maxValueDepth,\n maxNodes: limits.maxValueNodes,\n maxStringLength: limits.maxStringLength,\n });\n } catch (error) {\n if (error instanceof RangeError) throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n throw new KaladaFailure(\"KALADA_INVALID_RESULT\", path);\n }\n}\n\nfunction safeKeys(input: object, path: Path): PropertyKey[] {\n try {\n return Reflect.ownKeys(input);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n}\n\nfunction safeData(input: object, key: string, path: Path): unknown {\n try {\n return dataValue(input, key);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n}\n\nfunction charge<R extends JsonValue>(path: Path, state: State<R>): void {\n state.steps += 1;\n if (state.steps > state.limits.maxEvaluationSteps) {\n throw new KaladaFailure(\"KALADA_EVALUATION_LIMIT\", path);\n }\n}\n"]}
@@ -30,6 +30,19 @@ const err = (value) => ({
30
30
  });
31
31
  const arm = (variant, body, name) => ({ variant, ...name === void 0 ? {} : { binding: name }, body });
32
32
  const match = (type, value, arms) => ({ kind: "match", type, value, arms });
33
+ const instant = (milliseconds) => ({
34
+ kind: "instant",
35
+ milliseconds
36
+ });
37
+ const duration = (milliseconds) => ({
38
+ kind: "duration",
39
+ milliseconds
40
+ });
41
+ const currentInstant = () => ({
42
+ kind: "current-instant"
43
+ });
44
+ const temporalArithmetic = (operator, left, right) => ({ kind: "temporal-arithmetic", operator, left, right });
45
+ const temporalComparison = (operator, left, right) => ({ kind: "temporal-comparison", operator, left, right });
33
46
  const KaladaV1 = Object.freeze({
34
47
  literal,
35
48
  ref,
@@ -38,6 +51,11 @@ const KaladaV1 = Object.freeze({
38
51
  Result: Object.freeze({ ok, err }),
39
52
  arm,
40
53
  match,
54
+ instant,
55
+ duration,
56
+ currentInstant,
57
+ temporalArithmetic,
58
+ temporalComparison,
41
59
  program(expression) {
42
60
  return { format: "kalada-program", version: 1, profile: "kalada-v1", expression };
43
61
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/factories.ts"],"names":[],"mappings":";;AAGA,MAAM,OAAA,GAAU,CAA+B,KAAA,MAA6C;AAAA,EAC1F,IAAA,EAAM,SAAA;AAAA,EACN;AACF,CAAA,CAAA;AACA,MAAM,GAAA,GAAM,CAA+B,KAAA,MAAqC;AAAA,EAC9E,IAAA,EAAM,KAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA,CAAA;AACA,MAAM,OAAA,GAAU,CACd,IAAA,EACA,KAAA,EACA,IAAA,MAC2B,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,CAAA;AAClE,MAAM,IAAA,GAAO,CAAsB,KAAA,MAAyD;AAAA,EAC1F,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,MAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,OAAO,OAA4D;AAAA,EACvE,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA,CAAA;AACA,MAAM,EAAA,GAAK,CAAsB,KAAA,MAAyD;AAAA,EACxF,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,IAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,GAAA,GAAM,CAAsB,KAAA,MAAyD;AAAA,EACzF,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,KAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,MAAM,CACV,OAAA,EACA,IAAA,EACA,IAAA,MACiB,EAAE,OAAA,EAAS,GAAI,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAS,IAAA,IAAS,IAAA,EAAK,CAAA;AACrF,MAAM,KAAA,GAAQ,CACZ,IAAA,EACA,KAAA,EACA,IAAA,MAC2B,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,CAAA;AAEzD,MAAM,QAAA,GAAW,OAAO,MAAA,CAAO;AAAA,EACpC,OAAA;AAAA,EACA,GAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC,QAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,EAAA,EAAI,KAAK,CAAA;AAAA,EACjC,GAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAsC,UAAA,EAAuD;AAC3F,IAAA,OAAO,EAAE,MAAA,EAAQ,gBAAA,EAAkB,SAAS,CAAA,EAAG,OAAA,EAAS,aAAa,UAAA,EAAW;AAAA,EAClF;AACF,CAAC","file":"factories.cjs","sourcesContent":["import type { JsonValue } from \"./json.js\";\nimport type { KaladaV1Expression, KaladaV1Program, MatchArm } from \"./types.js\";\n\nconst literal = <R extends JsonValue = string>(value: JsonValue): KaladaV1Expression<R> => ({\n kind: \"literal\",\n value,\n});\nconst ref = <R extends JsonValue = string>(value: R): KaladaV1Expression<R> => ({\n kind: \"ref\",\n ref: value,\n});\nconst binding = <R extends JsonValue>(\n name: string,\n value: KaladaV1Expression<R>,\n body: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"binding\", name, value, body });\nconst some = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"some\",\n value,\n});\nconst none = <R extends JsonValue = string>(): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"none\",\n});\nconst ok = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"ok\",\n value,\n});\nconst err = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"err\",\n value,\n});\nconst arm = <R extends JsonValue>(\n variant: MatchArm<R>[\"variant\"],\n body: KaladaV1Expression<R>,\n name?: string,\n): MatchArm<R> => ({ variant, ...(name === undefined ? {} : { binding: name }), body });\nconst match = <R extends JsonValue>(\n type: \"Option\" | \"Result\",\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n): KaladaV1Expression<R> => ({ kind: \"match\", type, value, arms });\n\nexport const KaladaV1 = Object.freeze({\n literal,\n ref,\n binding,\n Option: Object.freeze({ some, none }),\n Result: Object.freeze({ ok, err }),\n arm,\n match,\n program<R extends JsonValue = string>(expression: KaladaV1Expression<R>): KaladaV1Program<R> {\n return { format: \"kalada-program\", version: 1, profile: \"kalada-v1\", expression };\n },\n});\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/factories.ts"],"names":[],"mappings":";;AAGA,MAAM,OAAA,GAAU,CAA+B,KAAA,MAA6C;AAAA,EAC1F,IAAA,EAAM,SAAA;AAAA,EACN;AACF,CAAA,CAAA;AACA,MAAM,GAAA,GAAM,CAA+B,KAAA,MAAqC;AAAA,EAC9E,IAAA,EAAM,KAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA,CAAA;AACA,MAAM,OAAA,GAAU,CACd,IAAA,EACA,KAAA,EACA,IAAA,MAC2B,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,CAAA;AAClE,MAAM,IAAA,GAAO,CAAsB,KAAA,MAAyD;AAAA,EAC1F,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,MAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,OAAO,OAA4D;AAAA,EACvE,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA,CAAA;AACA,MAAM,EAAA,GAAK,CAAsB,KAAA,MAAyD;AAAA,EACxF,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,IAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,GAAA,GAAM,CAAsB,KAAA,MAAyD;AAAA,EACzF,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,KAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,MAAM,CACV,OAAA,EACA,IAAA,EACA,IAAA,MACiB,EAAE,OAAA,EAAS,GAAI,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAS,IAAA,IAAS,IAAA,EAAK,CAAA;AACrF,MAAM,KAAA,GAAQ,CACZ,IAAA,EACA,KAAA,EACA,IAAA,MAC2B,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,CAAA;AAChE,MAAM,OAAA,GAAU,CAA+B,YAAA,MAAiD;AAAA,EAC9F,IAAA,EAAM,SAAA;AAAA,EACN;AACF,CAAA,CAAA;AACA,MAAM,QAAA,GAAW,CAA+B,YAAA,MAAiD;AAAA,EAC/F,IAAA,EAAM,UAAA;AAAA,EACN;AACF,CAAA,CAAA;AACA,MAAM,iBAAiB,OAA4D;AAAA,EACjF,IAAA,EAAM;AACR,CAAA,CAAA;AACA,MAAM,kBAAA,GAAqB,CACzB,QAAA,EACA,IAAA,EACA,KAAA,MAC2B,EAAE,IAAA,EAAM,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM,CAAA;AAClF,MAAM,kBAAA,GAAqB,CACzB,QAAA,EACA,IAAA,EACA,KAAA,MAC2B,EAAE,IAAA,EAAM,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM,CAAA;AAE3E,MAAM,QAAA,GAAW,OAAO,MAAA,CAAO;AAAA,EACpC,OAAA;AAAA,EACA,GAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC,QAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,EAAA,EAAI,KAAK,CAAA;AAAA,EACjC,GAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,QAAsC,UAAA,EAAuD;AAC3F,IAAA,OAAO,EAAE,MAAA,EAAQ,gBAAA,EAAkB,SAAS,CAAA,EAAG,OAAA,EAAS,aAAa,UAAA,EAAW;AAAA,EAClF;AACF,CAAC","file":"factories.cjs","sourcesContent":["import type { JsonValue } from \"./json.js\";\nimport type { KaladaV1Expression, KaladaV1Program, MatchArm } from \"./types.js\";\n\nconst literal = <R extends JsonValue = string>(value: JsonValue): KaladaV1Expression<R> => ({\n kind: \"literal\",\n value,\n});\nconst ref = <R extends JsonValue = string>(value: R): KaladaV1Expression<R> => ({\n kind: \"ref\",\n ref: value,\n});\nconst binding = <R extends JsonValue>(\n name: string,\n value: KaladaV1Expression<R>,\n body: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"binding\", name, value, body });\nconst some = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"some\",\n value,\n});\nconst none = <R extends JsonValue = string>(): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"none\",\n});\nconst ok = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"ok\",\n value,\n});\nconst err = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"err\",\n value,\n});\nconst arm = <R extends JsonValue>(\n variant: MatchArm<R>[\"variant\"],\n body: KaladaV1Expression<R>,\n name?: string,\n): MatchArm<R> => ({ variant, ...(name === undefined ? {} : { binding: name }), body });\nconst match = <R extends JsonValue>(\n type: \"Option\" | \"Result\",\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n): KaladaV1Expression<R> => ({ kind: \"match\", type, value, arms });\nconst instant = <R extends JsonValue = string>(milliseconds: number): KaladaV1Expression<R> => ({\n kind: \"instant\",\n milliseconds,\n});\nconst duration = <R extends JsonValue = string>(milliseconds: number): KaladaV1Expression<R> => ({\n kind: \"duration\",\n milliseconds,\n});\nconst currentInstant = <R extends JsonValue = string>(): KaladaV1Expression<R> => ({\n kind: \"current-instant\",\n});\nconst temporalArithmetic = <R extends JsonValue>(\n operator: \"add\" | \"subtract\",\n left: KaladaV1Expression<R>,\n right: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"temporal-arithmetic\", operator, left, right });\nconst temporalComparison = <R extends JsonValue>(\n operator: Extract<KaladaV1Expression<R>, { kind: \"temporal-comparison\" }>[\"operator\"],\n left: KaladaV1Expression<R>,\n right: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"temporal-comparison\", operator, left, right });\n\nexport const KaladaV1 = Object.freeze({\n literal,\n ref,\n binding,\n Option: Object.freeze({ some, none }),\n Result: Object.freeze({ ok, err }),\n arm,\n match,\n instant,\n duration,\n currentInstant,\n temporalArithmetic,\n temporalComparison,\n program<R extends JsonValue = string>(expression: KaladaV1Expression<R>): KaladaV1Program<R> {\n return { format: \"kalada-program\", version: 1, profile: \"kalada-v1\", expression };\n },\n});\n"]}
@@ -1,5 +1,6 @@
1
1
  import { JsonValue } from './json.cjs';
2
2
  import { KaladaV1Expression, MatchArm, KaladaV1Program } from './types.cjs';
3
+ import './temporal.cjs';
3
4
  import './values.cjs';
4
5
 
5
6
  declare const KaladaV1: Readonly<{
@@ -16,6 +17,13 @@ declare const KaladaV1: Readonly<{
16
17
  }>;
17
18
  arm: <R extends JsonValue>(variant: MatchArm<R>["variant"], body: KaladaV1Expression<R>, name?: string) => MatchArm<R>;
18
19
  match: <R extends JsonValue>(type: "Option" | "Result", value: KaladaV1Expression<R>, arms: readonly MatchArm<R>[]) => KaladaV1Expression<R>;
20
+ instant: <R extends JsonValue = string>(milliseconds: number) => KaladaV1Expression<R>;
21
+ duration: <R extends JsonValue = string>(milliseconds: number) => KaladaV1Expression<R>;
22
+ currentInstant: <R extends JsonValue = string>() => KaladaV1Expression<R>;
23
+ temporalArithmetic: <R extends JsonValue>(operator: "add" | "subtract", left: KaladaV1Expression<R>, right: KaladaV1Expression<R>) => KaladaV1Expression<R>;
24
+ temporalComparison: <R extends JsonValue>(operator: Extract<KaladaV1Expression<R>, {
25
+ kind: "temporal-comparison";
26
+ }>["operator"], left: KaladaV1Expression<R>, right: KaladaV1Expression<R>) => KaladaV1Expression<R>;
19
27
  program<R extends JsonValue = string>(expression: KaladaV1Expression<R>): KaladaV1Program<R>;
20
28
  }>;
21
29
 
@@ -1,5 +1,6 @@
1
1
  import { JsonValue } from './json.js';
2
2
  import { KaladaV1Expression, MatchArm, KaladaV1Program } from './types.js';
3
+ import './temporal.js';
3
4
  import './values.js';
4
5
 
5
6
  declare const KaladaV1: Readonly<{
@@ -16,6 +17,13 @@ declare const KaladaV1: Readonly<{
16
17
  }>;
17
18
  arm: <R extends JsonValue>(variant: MatchArm<R>["variant"], body: KaladaV1Expression<R>, name?: string) => MatchArm<R>;
18
19
  match: <R extends JsonValue>(type: "Option" | "Result", value: KaladaV1Expression<R>, arms: readonly MatchArm<R>[]) => KaladaV1Expression<R>;
20
+ instant: <R extends JsonValue = string>(milliseconds: number) => KaladaV1Expression<R>;
21
+ duration: <R extends JsonValue = string>(milliseconds: number) => KaladaV1Expression<R>;
22
+ currentInstant: <R extends JsonValue = string>() => KaladaV1Expression<R>;
23
+ temporalArithmetic: <R extends JsonValue>(operator: "add" | "subtract", left: KaladaV1Expression<R>, right: KaladaV1Expression<R>) => KaladaV1Expression<R>;
24
+ temporalComparison: <R extends JsonValue>(operator: Extract<KaladaV1Expression<R>, {
25
+ kind: "temporal-comparison";
26
+ }>["operator"], left: KaladaV1Expression<R>, right: KaladaV1Expression<R>) => KaladaV1Expression<R>;
19
27
  program<R extends JsonValue = string>(expression: KaladaV1Expression<R>): KaladaV1Program<R>;
20
28
  }>;
21
29
 
@@ -28,6 +28,19 @@ const err = (value) => ({
28
28
  });
29
29
  const arm = (variant, body, name) => ({ variant, ...name === void 0 ? {} : { binding: name }, body });
30
30
  const match = (type, value, arms) => ({ kind: "match", type, value, arms });
31
+ const instant = (milliseconds) => ({
32
+ kind: "instant",
33
+ milliseconds
34
+ });
35
+ const duration = (milliseconds) => ({
36
+ kind: "duration",
37
+ milliseconds
38
+ });
39
+ const currentInstant = () => ({
40
+ kind: "current-instant"
41
+ });
42
+ const temporalArithmetic = (operator, left, right) => ({ kind: "temporal-arithmetic", operator, left, right });
43
+ const temporalComparison = (operator, left, right) => ({ kind: "temporal-comparison", operator, left, right });
31
44
  const KaladaV1 = Object.freeze({
32
45
  literal,
33
46
  ref,
@@ -36,6 +49,11 @@ const KaladaV1 = Object.freeze({
36
49
  Result: Object.freeze({ ok, err }),
37
50
  arm,
38
51
  match,
52
+ instant,
53
+ duration,
54
+ currentInstant,
55
+ temporalArithmetic,
56
+ temporalComparison,
39
57
  program(expression) {
40
58
  return { format: "kalada-program", version: 1, profile: "kalada-v1", expression };
41
59
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/factories.ts"],"names":[],"mappings":"AAGA,MAAM,OAAA,GAAU,CAA+B,KAAA,MAA6C;AAAA,EAC1F,IAAA,EAAM,SAAA;AAAA,EACN;AACF,CAAA,CAAA;AACA,MAAM,GAAA,GAAM,CAA+B,KAAA,MAAqC;AAAA,EAC9E,IAAA,EAAM,KAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA,CAAA;AACA,MAAM,OAAA,GAAU,CACd,IAAA,EACA,KAAA,EACA,IAAA,MAC2B,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,CAAA;AAClE,MAAM,IAAA,GAAO,CAAsB,KAAA,MAAyD;AAAA,EAC1F,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,MAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,OAAO,OAA4D;AAAA,EACvE,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA,CAAA;AACA,MAAM,EAAA,GAAK,CAAsB,KAAA,MAAyD;AAAA,EACxF,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,IAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,GAAA,GAAM,CAAsB,KAAA,MAAyD;AAAA,EACzF,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,KAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,MAAM,CACV,OAAA,EACA,IAAA,EACA,IAAA,MACiB,EAAE,OAAA,EAAS,GAAI,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAS,IAAA,IAAS,IAAA,EAAK,CAAA;AACrF,MAAM,KAAA,GAAQ,CACZ,IAAA,EACA,KAAA,EACA,IAAA,MAC2B,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,CAAA;AAEzD,MAAM,QAAA,GAAW,OAAO,MAAA,CAAO;AAAA,EACpC,OAAA;AAAA,EACA,GAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC,QAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,EAAA,EAAI,KAAK,CAAA;AAAA,EACjC,GAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAsC,UAAA,EAAuD;AAC3F,IAAA,OAAO,EAAE,MAAA,EAAQ,gBAAA,EAAkB,SAAS,CAAA,EAAG,OAAA,EAAS,aAAa,UAAA,EAAW;AAAA,EAClF;AACF,CAAC","file":"factories.js","sourcesContent":["import type { JsonValue } from \"./json.js\";\nimport type { KaladaV1Expression, KaladaV1Program, MatchArm } from \"./types.js\";\n\nconst literal = <R extends JsonValue = string>(value: JsonValue): KaladaV1Expression<R> => ({\n kind: \"literal\",\n value,\n});\nconst ref = <R extends JsonValue = string>(value: R): KaladaV1Expression<R> => ({\n kind: \"ref\",\n ref: value,\n});\nconst binding = <R extends JsonValue>(\n name: string,\n value: KaladaV1Expression<R>,\n body: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"binding\", name, value, body });\nconst some = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"some\",\n value,\n});\nconst none = <R extends JsonValue = string>(): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"none\",\n});\nconst ok = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"ok\",\n value,\n});\nconst err = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"err\",\n value,\n});\nconst arm = <R extends JsonValue>(\n variant: MatchArm<R>[\"variant\"],\n body: KaladaV1Expression<R>,\n name?: string,\n): MatchArm<R> => ({ variant, ...(name === undefined ? {} : { binding: name }), body });\nconst match = <R extends JsonValue>(\n type: \"Option\" | \"Result\",\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n): KaladaV1Expression<R> => ({ kind: \"match\", type, value, arms });\n\nexport const KaladaV1 = Object.freeze({\n literal,\n ref,\n binding,\n Option: Object.freeze({ some, none }),\n Result: Object.freeze({ ok, err }),\n arm,\n match,\n program<R extends JsonValue = string>(expression: KaladaV1Expression<R>): KaladaV1Program<R> {\n return { format: \"kalada-program\", version: 1, profile: \"kalada-v1\", expression };\n },\n});\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/factories.ts"],"names":[],"mappings":"AAGA,MAAM,OAAA,GAAU,CAA+B,KAAA,MAA6C;AAAA,EAC1F,IAAA,EAAM,SAAA;AAAA,EACN;AACF,CAAA,CAAA;AACA,MAAM,GAAA,GAAM,CAA+B,KAAA,MAAqC;AAAA,EAC9E,IAAA,EAAM,KAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA,CAAA;AACA,MAAM,OAAA,GAAU,CACd,IAAA,EACA,KAAA,EACA,IAAA,MAC2B,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,CAAA;AAClE,MAAM,IAAA,GAAO,CAAsB,KAAA,MAAyD;AAAA,EAC1F,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,MAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,OAAO,OAA4D;AAAA,EACvE,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA,CAAA;AACA,MAAM,EAAA,GAAK,CAAsB,KAAA,MAAyD;AAAA,EACxF,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,IAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,GAAA,GAAM,CAAsB,KAAA,MAAyD;AAAA,EACzF,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,KAAA;AAAA,EACT;AACF,CAAA,CAAA;AACA,MAAM,MAAM,CACV,OAAA,EACA,IAAA,EACA,IAAA,MACiB,EAAE,OAAA,EAAS,GAAI,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAS,IAAA,IAAS,IAAA,EAAK,CAAA;AACrF,MAAM,KAAA,GAAQ,CACZ,IAAA,EACA,KAAA,EACA,IAAA,MAC2B,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,CAAA;AAChE,MAAM,OAAA,GAAU,CAA+B,YAAA,MAAiD;AAAA,EAC9F,IAAA,EAAM,SAAA;AAAA,EACN;AACF,CAAA,CAAA;AACA,MAAM,QAAA,GAAW,CAA+B,YAAA,MAAiD;AAAA,EAC/F,IAAA,EAAM,UAAA;AAAA,EACN;AACF,CAAA,CAAA;AACA,MAAM,iBAAiB,OAA4D;AAAA,EACjF,IAAA,EAAM;AACR,CAAA,CAAA;AACA,MAAM,kBAAA,GAAqB,CACzB,QAAA,EACA,IAAA,EACA,KAAA,MAC2B,EAAE,IAAA,EAAM,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM,CAAA;AAClF,MAAM,kBAAA,GAAqB,CACzB,QAAA,EACA,IAAA,EACA,KAAA,MAC2B,EAAE,IAAA,EAAM,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM,CAAA;AAE3E,MAAM,QAAA,GAAW,OAAO,MAAA,CAAO;AAAA,EACpC,OAAA;AAAA,EACA,GAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC,QAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,EAAA,EAAI,KAAK,CAAA;AAAA,EACjC,GAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,QAAsC,UAAA,EAAuD;AAC3F,IAAA,OAAO,EAAE,MAAA,EAAQ,gBAAA,EAAkB,SAAS,CAAA,EAAG,OAAA,EAAS,aAAa,UAAA,EAAW;AAAA,EAClF;AACF,CAAC","file":"factories.js","sourcesContent":["import type { JsonValue } from \"./json.js\";\nimport type { KaladaV1Expression, KaladaV1Program, MatchArm } from \"./types.js\";\n\nconst literal = <R extends JsonValue = string>(value: JsonValue): KaladaV1Expression<R> => ({\n kind: \"literal\",\n value,\n});\nconst ref = <R extends JsonValue = string>(value: R): KaladaV1Expression<R> => ({\n kind: \"ref\",\n ref: value,\n});\nconst binding = <R extends JsonValue>(\n name: string,\n value: KaladaV1Expression<R>,\n body: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"binding\", name, value, body });\nconst some = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"some\",\n value,\n});\nconst none = <R extends JsonValue = string>(): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"none\",\n});\nconst ok = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"ok\",\n value,\n});\nconst err = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"err\",\n value,\n});\nconst arm = <R extends JsonValue>(\n variant: MatchArm<R>[\"variant\"],\n body: KaladaV1Expression<R>,\n name?: string,\n): MatchArm<R> => ({ variant, ...(name === undefined ? {} : { binding: name }), body });\nconst match = <R extends JsonValue>(\n type: \"Option\" | \"Result\",\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n): KaladaV1Expression<R> => ({ kind: \"match\", type, value, arms });\nconst instant = <R extends JsonValue = string>(milliseconds: number): KaladaV1Expression<R> => ({\n kind: \"instant\",\n milliseconds,\n});\nconst duration = <R extends JsonValue = string>(milliseconds: number): KaladaV1Expression<R> => ({\n kind: \"duration\",\n milliseconds,\n});\nconst currentInstant = <R extends JsonValue = string>(): KaladaV1Expression<R> => ({\n kind: \"current-instant\",\n});\nconst temporalArithmetic = <R extends JsonValue>(\n operator: \"add\" | \"subtract\",\n left: KaladaV1Expression<R>,\n right: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"temporal-arithmetic\", operator, left, right });\nconst temporalComparison = <R extends JsonValue>(\n operator: Extract<KaladaV1Expression<R>, { kind: \"temporal-comparison\" }>[\"operator\"],\n left: KaladaV1Expression<R>,\n right: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"temporal-comparison\", operator, left, right });\n\nexport const KaladaV1 = Object.freeze({\n literal,\n ref,\n binding,\n Option: Object.freeze({ some, none }),\n Result: Object.freeze({ ok, err }),\n arm,\n match,\n instant,\n duration,\n currentInstant,\n temporalArithmetic,\n temporalComparison,\n program<R extends JsonValue = string>(expression: KaladaV1Expression<R>): KaladaV1Program<R> {\n return { format: \"kalada-program\", version: 1, profile: \"kalada-v1\", expression };\n },\n});\n"]}
@@ -7,6 +7,7 @@ var dependencies_js = require('./dependencies.js');
7
7
  var factories_js = require('./factories.js');
8
8
  var limits_js = require('./limits.js');
9
9
  var schemas_js = require('./schemas.js');
10
+ var temporal_js = require('./temporal.js');
10
11
  var values_js = require('./values.js');
11
12
 
12
13
 
@@ -47,6 +48,22 @@ Object.defineProperty(exports, "KALADA_VALUE_V1_SCHEMA", {
47
48
  enumerable: true,
48
49
  get: function () { return schemas_js.KALADA_VALUE_V1_SCHEMA; }
49
50
  });
51
+ Object.defineProperty(exports, "Duration", {
52
+ enumerable: true,
53
+ get: function () { return temporal_js.Duration; }
54
+ });
55
+ Object.defineProperty(exports, "Instant", {
56
+ enumerable: true,
57
+ get: function () { return temporal_js.Instant; }
58
+ });
59
+ Object.defineProperty(exports, "isDuration", {
60
+ enumerable: true,
61
+ get: function () { return temporal_js.isDuration; }
62
+ });
63
+ Object.defineProperty(exports, "isInstant", {
64
+ enumerable: true,
65
+ get: function () { return temporal_js.isInstant; }
66
+ });
50
67
  Object.defineProperty(exports, "Option", {
51
68
  enumerable: true,
52
69
  get: function () { return values_js.Option; }
@@ -6,5 +6,6 @@ export { KaladaV1 } from './factories.cjs';
6
6
  export { JsonPrimitive, JsonValue } from './json.cjs';
7
7
  export { DEFAULT_KALADA_V1_LIMITS } from './limits.cjs';
8
8
  export { KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA, KaladaV1JsonSchema } from './schemas.cjs';
9
- export { BindingExpression, CompiledKaladaV1Program, KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1Expression, KaladaV1Limits, KaladaV1Options, KaladaV1Outcome, KaladaV1Program, KaladaV1ReferenceCodec, KaladaV1Resolution, KaladaV1Resolver, MatchArm, MatchExpression, OptionExpression, ResultExpression } from './types.cjs';
9
+ export { Duration, DurationValue, Instant, InstantValue, isDuration, isInstant } from './temporal.cjs';
10
+ export { BindingExpression, CompiledKaladaV1Program, CurrentInstantExpression, DurationExpression, InstantExpression, KaladaV1Clock, KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1EvaluationInputs, KaladaV1Expression, KaladaV1Limits, KaladaV1Options, KaladaV1Outcome, KaladaV1Program, KaladaV1ReferenceCodec, KaladaV1Resolution, KaladaV1Resolver, MatchArm, MatchExpression, OptionExpression, ResultExpression, TemporalArithmeticExpression, TemporalComparisonExpression } from './types.cjs';
10
11
  export { ErrValue, KaladaValue, NoneValue, OkValue, Option, OptionValue, Result, ResultValue, SomeValue, equalKaladaValues, isOption, isResult } from './values.cjs';
@@ -6,5 +6,6 @@ export { KaladaV1 } from './factories.js';
6
6
  export { JsonPrimitive, JsonValue } from './json.js';
7
7
  export { DEFAULT_KALADA_V1_LIMITS } from './limits.js';
8
8
  export { KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA, KaladaV1JsonSchema } from './schemas.js';
9
- export { BindingExpression, CompiledKaladaV1Program, KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1Expression, KaladaV1Limits, KaladaV1Options, KaladaV1Outcome, KaladaV1Program, KaladaV1ReferenceCodec, KaladaV1Resolution, KaladaV1Resolver, MatchArm, MatchExpression, OptionExpression, ResultExpression } from './types.js';
9
+ export { Duration, DurationValue, Instant, InstantValue, isDuration, isInstant } from './temporal.js';
10
+ export { BindingExpression, CompiledKaladaV1Program, CurrentInstantExpression, DurationExpression, InstantExpression, KaladaV1Clock, KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1EvaluationInputs, KaladaV1Expression, KaladaV1Limits, KaladaV1Options, KaladaV1Outcome, KaladaV1Program, KaladaV1ReferenceCodec, KaladaV1Resolution, KaladaV1Resolver, MatchArm, MatchExpression, OptionExpression, ResultExpression, TemporalArithmeticExpression, TemporalComparisonExpression } from './types.js';
10
11
  export { ErrValue, KaladaValue, NoneValue, OkValue, Option, OptionValue, Result, ResultValue, SomeValue, equalKaladaValues, isOption, isResult } from './values.js';
@@ -5,6 +5,7 @@ export { collectKaladaV1Dependencies } from './dependencies.js';
5
5
  export { KaladaV1 } from './factories.js';
6
6
  export { DEFAULT_KALADA_V1_LIMITS } from './limits.js';
7
7
  export { KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA } from './schemas.js';
8
+ export { Duration, Instant, isDuration, isInstant } from './temporal.js';
8
9
  export { Option, Result, equalKaladaValues, isOption, isResult } from './values.js';
9
10
  //# sourceMappingURL=index.js.map
10
11
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,6 @@
1
1
  import { KaladaV1Limits } from './types.cjs';
2
2
  import './json.cjs';
3
+ import './temporal.cjs';
3
4
  import './values.cjs';
4
5
 
5
6
  declare const DEFAULT_KALADA_V1_LIMITS: KaladaV1Limits;
@@ -1,5 +1,6 @@
1
1
  import { KaladaV1Limits } from './types.js';
2
2
  import './json.js';
3
+ import './temporal.js';
3
4
  import './values.js';
4
5
 
5
6
  declare const DEFAULT_KALADA_V1_LIMITS: KaladaV1Limits;
@@ -58,6 +58,18 @@ const expression = {
58
58
  "variant",
59
59
  "value"
60
60
  ]),
61
+ node("instant", { milliseconds: safeInteger() }, ["milliseconds"]),
62
+ node("duration", { milliseconds: safeInteger() }, ["milliseconds"]),
63
+ node("current-instant", {}, []),
64
+ temporalNode("temporal-arithmetic", ["add", "subtract"]),
65
+ temporalNode("temporal-comparison", [
66
+ "equal",
67
+ "not-equal",
68
+ "less-than",
69
+ "less-than-or-equal",
70
+ "greater-than",
71
+ "greater-than-or-equal"
72
+ ]),
61
73
  matchNode("Option", [arm("some", true), arm("none", false)]),
62
74
  matchNode("Result", [arm("ok", true), arm("err", true)])
63
75
  ]
@@ -89,7 +101,9 @@ const KALADA_VALUE_V1_SCHEMA = deepFreeze({
89
101
  valueEnvelope("Option", "none"),
90
102
  valueEnvelope("Option", "some", { $ref: "#/$defs/encodedValue" }),
91
103
  valueEnvelope("Result", "ok", { $ref: "#/$defs/encodedValue" }),
92
- valueEnvelope("Result", "err", { $ref: "#/$defs/encodedValue" })
104
+ valueEnvelope("Result", "err", { $ref: "#/$defs/encodedValue" }),
105
+ valueEnvelope("Instant", "milliseconds", safeInteger()),
106
+ valueEnvelope("Duration", "milliseconds", safeInteger())
93
107
  ]
94
108
  }
95
109
  }
@@ -102,6 +116,20 @@ function node(kind, properties, required) {
102
116
  additionalProperties: false
103
117
  };
104
118
  }
119
+ function temporalNode(kind, operators) {
120
+ return node(
121
+ kind,
122
+ { operator: { enum: operators }, left: expressionRef(), right: expressionRef() },
123
+ ["operator", "left", "right"]
124
+ );
125
+ }
126
+ function safeInteger() {
127
+ return {
128
+ type: "integer",
129
+ minimum: Number.MIN_SAFE_INTEGER,
130
+ maximum: Number.MAX_SAFE_INTEGER
131
+ };
132
+ }
105
133
  function matchNode(type, arms) {
106
134
  return node(
107
135
  "match",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/schemas.ts"],"names":["DEFAULT_KALADA_V1_LIMITS"],"mappings":"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","file":"schemas.cjs","sourcesContent":["import { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\n\nexport type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;\n\nconst jsonValue = jsonValueSchema(\"#/$defs/jsonValue\", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);\nconst encodedJsonValue = jsonValueSchema(\n \"#/$defs/encodedJsonValue\",\n DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2,\n);\n\nfunction jsonValueSchema(reference: string, maxContainerSize: number): Record<string, unknown> {\n return {\n anyOf: [\n { type: \"null\" },\n { type: \"boolean\" },\n { type: \"number\", minimum: -1.7976931348623157e308, maximum: 1.7976931348623157e308 },\n { type: \"string\", maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n {\n type: \"array\",\n maxItems: maxContainerSize,\n items: { $ref: reference },\n },\n {\n type: \"object\",\n maxProperties: maxContainerSize,\n propertyNames: {\n allOf: [\n { maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n { not: { enum: [\"__proto__\", \"constructor\", \"prototype\"] } },\n ],\n },\n additionalProperties: { $ref: reference },\n },\n ],\n };\n}\n\nconst expression = {\n oneOf: [\n node(\"literal\", { value: { $ref: \"#/$defs/jsonValue\" } }, [\"value\"]),\n node(\n \"ref\",\n {\n ref: {\n type: \"string\",\n minLength: 1,\n maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength,\n },\n },\n [\"ref\"],\n ),\n node(\"binding\", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [\n \"name\",\n \"value\",\n \"body\",\n ]),\n node(\"option\", { variant: { const: \"none\" } }, [\"variant\"]),\n node(\"option\", { variant: { const: \"some\" }, value: expressionRef() }, [\"variant\", \"value\"]),\n node(\"result\", { variant: { enum: [\"ok\", \"err\"] }, value: expressionRef() }, [\n \"variant\",\n \"value\",\n ]),\n matchNode(\"Option\", [arm(\"some\", true), arm(\"none\", false)]),\n matchNode(\"Result\", [arm(\"ok\", true), arm(\"err\", true)]),\n ],\n};\n\nexport const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: { jsonValue, expression },\n});\n\nexport const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/value/kalada-value-v1\",\n $ref: \"#/$defs/encodedValue\",\n $defs: {\n encodedJsonValue,\n encodedValue: {\n oneOf: [\n valueEnvelope(\"Json\", \"value\", { $ref: \"#/$defs/encodedJsonValue\" }),\n valueEnvelope(\"Option\", \"none\"),\n valueEnvelope(\"Option\", \"some\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"ok\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"err\", { $ref: \"#/$defs/encodedValue\" }),\n ],\n },\n },\n});\n\nfunction node(\n kind: string,\n properties: Record<string, unknown>,\n required: string[],\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties: { kind: { const: kind }, ...properties },\n required: [\"kind\", ...required],\n additionalProperties: false,\n };\n}\n\nfunction matchNode(\n type: \"Option\" | \"Result\",\n arms: readonly Record<string, unknown>[],\n): Record<string, unknown> {\n return node(\n \"match\",\n {\n type: { const: type },\n value: expressionRef(),\n arms: { type: \"array\", prefixItems: arms, minItems: 2, maxItems: 2 },\n },\n [\"type\", \"value\", \"arms\"],\n );\n}\n\nfunction arm(variant: string, payload: boolean): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n variant: { const: variant },\n body: expressionRef(),\n };\n if (payload) properties.binding = bindingName();\n return { type: \"object\", properties, required: [\"variant\", \"body\"], additionalProperties: false };\n}\n\nfunction valueEnvelope(\n type: string,\n variant: string,\n value?: Record<string, unknown>,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n format: { const: \"kalada-value\" },\n version: { const: 1 },\n type: { const: type },\n variant: { const: variant },\n };\n if (value) properties.value = value;\n return {\n type: \"object\",\n properties,\n required: Object.keys(properties),\n additionalProperties: false,\n };\n}\n\nfunction expressionRef(): Record<string, string> {\n return { $ref: \"#/$defs/expression\" };\n}\n\nfunction bindingName(): Record<string, unknown> {\n return { type: \"string\", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const child of Object.values(value)) deepFreeze(child);\n return Object.freeze(value);\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/schemas.ts"],"names":["DEFAULT_KALADA_V1_LIMITS"],"mappings":"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","file":"schemas.cjs","sourcesContent":["import { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\n\nexport type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;\n\nconst jsonValue = jsonValueSchema(\"#/$defs/jsonValue\", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);\nconst encodedJsonValue = jsonValueSchema(\n \"#/$defs/encodedJsonValue\",\n DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2,\n);\n\nfunction jsonValueSchema(reference: string, maxContainerSize: number): Record<string, unknown> {\n return {\n anyOf: [\n { type: \"null\" },\n { type: \"boolean\" },\n { type: \"number\", minimum: -1.7976931348623157e308, maximum: 1.7976931348623157e308 },\n { type: \"string\", maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n {\n type: \"array\",\n maxItems: maxContainerSize,\n items: { $ref: reference },\n },\n {\n type: \"object\",\n maxProperties: maxContainerSize,\n propertyNames: {\n allOf: [\n { maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n { not: { enum: [\"__proto__\", \"constructor\", \"prototype\"] } },\n ],\n },\n additionalProperties: { $ref: reference },\n },\n ],\n };\n}\n\nconst expression = {\n oneOf: [\n node(\"literal\", { value: { $ref: \"#/$defs/jsonValue\" } }, [\"value\"]),\n node(\n \"ref\",\n {\n ref: {\n type: \"string\",\n minLength: 1,\n maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength,\n },\n },\n [\"ref\"],\n ),\n node(\"binding\", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [\n \"name\",\n \"value\",\n \"body\",\n ]),\n node(\"option\", { variant: { const: \"none\" } }, [\"variant\"]),\n node(\"option\", { variant: { const: \"some\" }, value: expressionRef() }, [\"variant\", \"value\"]),\n node(\"result\", { variant: { enum: [\"ok\", \"err\"] }, value: expressionRef() }, [\n \"variant\",\n \"value\",\n ]),\n node(\"instant\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"duration\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"current-instant\", {}, []),\n temporalNode(\"temporal-arithmetic\", [\"add\", \"subtract\"]),\n temporalNode(\"temporal-comparison\", [\n \"equal\",\n \"not-equal\",\n \"less-than\",\n \"less-than-or-equal\",\n \"greater-than\",\n \"greater-than-or-equal\",\n ]),\n matchNode(\"Option\", [arm(\"some\", true), arm(\"none\", false)]),\n matchNode(\"Result\", [arm(\"ok\", true), arm(\"err\", true)]),\n ],\n};\n\nexport const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: { jsonValue, expression },\n});\n\nexport const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/value/kalada-value-v1\",\n $ref: \"#/$defs/encodedValue\",\n $defs: {\n encodedJsonValue,\n encodedValue: {\n oneOf: [\n valueEnvelope(\"Json\", \"value\", { $ref: \"#/$defs/encodedJsonValue\" }),\n valueEnvelope(\"Option\", \"none\"),\n valueEnvelope(\"Option\", \"some\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"ok\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"err\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Instant\", \"milliseconds\", safeInteger()),\n valueEnvelope(\"Duration\", \"milliseconds\", safeInteger()),\n ],\n },\n },\n});\n\nfunction node(\n kind: string,\n properties: Record<string, unknown>,\n required: string[],\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties: { kind: { const: kind }, ...properties },\n required: [\"kind\", ...required],\n additionalProperties: false,\n };\n}\n\nfunction temporalNode(kind: string, operators: readonly string[]): Record<string, unknown> {\n return node(\n kind,\n { operator: { enum: operators }, left: expressionRef(), right: expressionRef() },\n [\"operator\", \"left\", \"right\"],\n );\n}\n\nfunction safeInteger(): Record<string, unknown> {\n return {\n type: \"integer\",\n minimum: Number.MIN_SAFE_INTEGER,\n maximum: Number.MAX_SAFE_INTEGER,\n };\n}\n\nfunction matchNode(\n type: \"Option\" | \"Result\",\n arms: readonly Record<string, unknown>[],\n): Record<string, unknown> {\n return node(\n \"match\",\n {\n type: { const: type },\n value: expressionRef(),\n arms: { type: \"array\", prefixItems: arms, minItems: 2, maxItems: 2 },\n },\n [\"type\", \"value\", \"arms\"],\n );\n}\n\nfunction arm(variant: string, payload: boolean): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n variant: { const: variant },\n body: expressionRef(),\n };\n if (payload) properties.binding = bindingName();\n return { type: \"object\", properties, required: [\"variant\", \"body\"], additionalProperties: false };\n}\n\nfunction valueEnvelope(\n type: string,\n variant: string,\n value?: Record<string, unknown>,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n format: { const: \"kalada-value\" },\n version: { const: 1 },\n type: { const: type },\n variant: { const: variant },\n };\n if (value) properties.value = value;\n return {\n type: \"object\",\n properties,\n required: Object.keys(properties),\n additionalProperties: false,\n };\n}\n\nfunction expressionRef(): Record<string, string> {\n return { $ref: \"#/$defs/expression\" };\n}\n\nfunction bindingName(): Record<string, unknown> {\n return { type: \"string\", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const child of Object.values(value)) deepFreeze(child);\n return Object.freeze(value);\n}\n"]}
@@ -56,6 +56,18 @@ const expression = {
56
56
  "variant",
57
57
  "value"
58
58
  ]),
59
+ node("instant", { milliseconds: safeInteger() }, ["milliseconds"]),
60
+ node("duration", { milliseconds: safeInteger() }, ["milliseconds"]),
61
+ node("current-instant", {}, []),
62
+ temporalNode("temporal-arithmetic", ["add", "subtract"]),
63
+ temporalNode("temporal-comparison", [
64
+ "equal",
65
+ "not-equal",
66
+ "less-than",
67
+ "less-than-or-equal",
68
+ "greater-than",
69
+ "greater-than-or-equal"
70
+ ]),
59
71
  matchNode("Option", [arm("some", true), arm("none", false)]),
60
72
  matchNode("Result", [arm("ok", true), arm("err", true)])
61
73
  ]
@@ -87,7 +99,9 @@ const KALADA_VALUE_V1_SCHEMA = deepFreeze({
87
99
  valueEnvelope("Option", "none"),
88
100
  valueEnvelope("Option", "some", { $ref: "#/$defs/encodedValue" }),
89
101
  valueEnvelope("Result", "ok", { $ref: "#/$defs/encodedValue" }),
90
- valueEnvelope("Result", "err", { $ref: "#/$defs/encodedValue" })
102
+ valueEnvelope("Result", "err", { $ref: "#/$defs/encodedValue" }),
103
+ valueEnvelope("Instant", "milliseconds", safeInteger()),
104
+ valueEnvelope("Duration", "milliseconds", safeInteger())
91
105
  ]
92
106
  }
93
107
  }
@@ -100,6 +114,20 @@ function node(kind, properties, required) {
100
114
  additionalProperties: false
101
115
  };
102
116
  }
117
+ function temporalNode(kind, operators) {
118
+ return node(
119
+ kind,
120
+ { operator: { enum: operators }, left: expressionRef(), right: expressionRef() },
121
+ ["operator", "left", "right"]
122
+ );
123
+ }
124
+ function safeInteger() {
125
+ return {
126
+ type: "integer",
127
+ minimum: Number.MIN_SAFE_INTEGER,
128
+ maximum: Number.MAX_SAFE_INTEGER
129
+ };
130
+ }
103
131
  function matchNode(type, arms) {
104
132
  return node(
105
133
  "match",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/schemas.ts"],"names":[],"mappings":"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","file":"schemas.js","sourcesContent":["import { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\n\nexport type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;\n\nconst jsonValue = jsonValueSchema(\"#/$defs/jsonValue\", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);\nconst encodedJsonValue = jsonValueSchema(\n \"#/$defs/encodedJsonValue\",\n DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2,\n);\n\nfunction jsonValueSchema(reference: string, maxContainerSize: number): Record<string, unknown> {\n return {\n anyOf: [\n { type: \"null\" },\n { type: \"boolean\" },\n { type: \"number\", minimum: -1.7976931348623157e308, maximum: 1.7976931348623157e308 },\n { type: \"string\", maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n {\n type: \"array\",\n maxItems: maxContainerSize,\n items: { $ref: reference },\n },\n {\n type: \"object\",\n maxProperties: maxContainerSize,\n propertyNames: {\n allOf: [\n { maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n { not: { enum: [\"__proto__\", \"constructor\", \"prototype\"] } },\n ],\n },\n additionalProperties: { $ref: reference },\n },\n ],\n };\n}\n\nconst expression = {\n oneOf: [\n node(\"literal\", { value: { $ref: \"#/$defs/jsonValue\" } }, [\"value\"]),\n node(\n \"ref\",\n {\n ref: {\n type: \"string\",\n minLength: 1,\n maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength,\n },\n },\n [\"ref\"],\n ),\n node(\"binding\", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [\n \"name\",\n \"value\",\n \"body\",\n ]),\n node(\"option\", { variant: { const: \"none\" } }, [\"variant\"]),\n node(\"option\", { variant: { const: \"some\" }, value: expressionRef() }, [\"variant\", \"value\"]),\n node(\"result\", { variant: { enum: [\"ok\", \"err\"] }, value: expressionRef() }, [\n \"variant\",\n \"value\",\n ]),\n matchNode(\"Option\", [arm(\"some\", true), arm(\"none\", false)]),\n matchNode(\"Result\", [arm(\"ok\", true), arm(\"err\", true)]),\n ],\n};\n\nexport const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: { jsonValue, expression },\n});\n\nexport const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/value/kalada-value-v1\",\n $ref: \"#/$defs/encodedValue\",\n $defs: {\n encodedJsonValue,\n encodedValue: {\n oneOf: [\n valueEnvelope(\"Json\", \"value\", { $ref: \"#/$defs/encodedJsonValue\" }),\n valueEnvelope(\"Option\", \"none\"),\n valueEnvelope(\"Option\", \"some\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"ok\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"err\", { $ref: \"#/$defs/encodedValue\" }),\n ],\n },\n },\n});\n\nfunction node(\n kind: string,\n properties: Record<string, unknown>,\n required: string[],\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties: { kind: { const: kind }, ...properties },\n required: [\"kind\", ...required],\n additionalProperties: false,\n };\n}\n\nfunction matchNode(\n type: \"Option\" | \"Result\",\n arms: readonly Record<string, unknown>[],\n): Record<string, unknown> {\n return node(\n \"match\",\n {\n type: { const: type },\n value: expressionRef(),\n arms: { type: \"array\", prefixItems: arms, minItems: 2, maxItems: 2 },\n },\n [\"type\", \"value\", \"arms\"],\n );\n}\n\nfunction arm(variant: string, payload: boolean): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n variant: { const: variant },\n body: expressionRef(),\n };\n if (payload) properties.binding = bindingName();\n return { type: \"object\", properties, required: [\"variant\", \"body\"], additionalProperties: false };\n}\n\nfunction valueEnvelope(\n type: string,\n variant: string,\n value?: Record<string, unknown>,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n format: { const: \"kalada-value\" },\n version: { const: 1 },\n type: { const: type },\n variant: { const: variant },\n };\n if (value) properties.value = value;\n return {\n type: \"object\",\n properties,\n required: Object.keys(properties),\n additionalProperties: false,\n };\n}\n\nfunction expressionRef(): Record<string, string> {\n return { $ref: \"#/$defs/expression\" };\n}\n\nfunction bindingName(): Record<string, unknown> {\n return { type: \"string\", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const child of Object.values(value)) deepFreeze(child);\n return Object.freeze(value);\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/schemas.ts"],"names":[],"mappings":";;AAIA,MAAM,SAAA,GAAY,eAAA,CAAgB,mBAAA,EAAqB,wBAAA,CAAyB,gBAAgB,CAAC,CAAA;AACjG,MAAM,gBAAA,GAAmB,eAAA;AAAA,EACvB,0BAAA;AAAA,EACA,yBAAyB,aAAA,GAAgB;AAC3C,CAAA;AAEA,SAAS,eAAA,CAAgB,WAAmB,gBAAA,EAAmD;AAC7F,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,MAAA,EAAO;AAAA,MACf,EAAE,MAAM,SAAA,EAAU;AAAA,MAClB,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,sBAAA,EAAyB,SAAS,qBAAA,EAAuB;AAAA,MACpF,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,yBAAyB,eAAA,EAAgB;AAAA,MACtE;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,QAAA,EAAU,gBAAA;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA;AAAU,OAC3B;AAAA,MACA;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,aAAA,EAAe,gBAAA;AAAA,QACf,aAAA,EAAe;AAAA,UACb,KAAA,EAAO;AAAA,YACL,EAAE,SAAA,EAAW,wBAAA,CAAyB,eAAA,EAAgB;AAAA,YACtD,EAAE,KAAK,EAAE,IAAA,EAAM,CAAC,WAAA,EAAa,aAAA,EAAe,WAAW,CAAA,EAAE;AAAE;AAC7D,SACF;AAAA,QACA,oBAAA,EAAsB,EAAE,IAAA,EAAM,SAAA;AAAU;AAC1C;AACF,GACF;AACF;AAEA,MAAM,UAAA,GAAa;AAAA,EACjB,KAAA,EAAO;AAAA,IACL,IAAA,CAAK,SAAA,EAAW,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,mBAAA,EAAoB,EAAE,EAAG,CAAC,OAAO,CAAC,CAAA;AAAA,IACnE,IAAA;AAAA,MACE,KAAA;AAAA,MACA;AAAA,QACE,GAAA,EAAK;AAAA,UACH,IAAA,EAAM,QAAA;AAAA,UACN,SAAA,EAAW,CAAA;AAAA,UACX,WAAW,wBAAA,CAAyB;AAAA;AACtC,OACF;AAAA,MACA,CAAC,KAAK;AAAA,KACR;AAAA,IACA,IAAA,CAAK,SAAA,EAAW,EAAE,IAAA,EAAM,WAAA,EAAY,EAAG,KAAA,EAAO,aAAA,EAAc,EAAG,IAAA,EAAM,aAAA,EAAc,EAAE,EAAG;AAAA,MACtF,MAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD,IAAA,CAAK,QAAA,EAAU,EAAE,OAAA,EAAS,EAAE,KAAA,EAAO,MAAA,EAAO,EAAE,EAAG,CAAC,SAAS,CAAC,CAAA;AAAA,IAC1D,IAAA,CAAK,QAAA,EAAU,EAAE,OAAA,EAAS,EAAE,KAAA,EAAO,MAAA,EAAO,EAAG,KAAA,EAAO,eAAc,EAAE,EAAG,CAAC,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,IAC3F,IAAA,CAAK,QAAA,EAAU,EAAE,OAAA,EAAS,EAAE,IAAA,EAAM,CAAC,IAAA,EAAM,KAAK,CAAA,EAAE,EAAG,KAAA,EAAO,aAAA,IAAgB,EAAG;AAAA,MAC3E,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD,IAAA,CAAK,WAAW,EAAE,YAAA,EAAc,aAAY,EAAE,EAAG,CAAC,cAAc,CAAC,CAAA;AAAA,IACjE,IAAA,CAAK,YAAY,EAAE,YAAA,EAAc,aAAY,EAAE,EAAG,CAAC,cAAc,CAAC,CAAA;AAAA,IAClE,IAAA,CAAK,iBAAA,EAAmB,EAAC,EAAG,EAAE,CAAA;AAAA,IAC9B,YAAA,CAAa,qBAAA,EAAuB,CAAC,KAAA,EAAO,UAAU,CAAC,CAAA;AAAA,IACvD,aAAa,qBAAA,EAAuB;AAAA,MAClC,OAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,oBAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD,SAAA,CAAU,QAAA,EAAU,CAAC,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA,EAAG,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAC,CAAC,CAAA;AAAA,IAC3D,SAAA,CAAU,QAAA,EAAU,CAAC,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA,EAAG,GAAA,CAAI,KAAA,EAAO,IAAI,CAAC,CAAC;AAAA;AAE3D,CAAA;AAEO,MAAM,2BAA+C,UAAA,CAAW;AAAA,EACrE,OAAA,EAAS,8CAAA;AAAA,EACT,GAAA,EAAK,6CAAA;AAAA,EACL,QAAA,EACE,wKAAA;AAAA,EACF,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,MAAA,EAAQ,EAAE,KAAA,EAAO,gBAAA,EAAiB;AAAA,IAClC,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,IACpB,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAY;AAAA,IAC9B,YAAY,aAAA;AAAc,GAC5B;AAAA,EACA,QAAA,EAAU,CAAC,QAAA,EAAU,SAAA,EAAW,WAAW,YAAY,CAAA;AAAA,EACvD,oBAAA,EAAsB,KAAA;AAAA,EACtB,KAAA,EAAO,EAAE,SAAA,EAAW,UAAA;AACtB,CAAC;AAEM,MAAM,yBAA6C,UAAA,CAAW;AAAA,EACnE,OAAA,EAAS,8CAAA;AAAA,EACT,GAAA,EAAK,iDAAA;AAAA,EACL,IAAA,EAAM,sBAAA;AAAA,EACN,KAAA,EAAO;AAAA,IACL,gBAAA;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,cAAc,MAAA,EAAQ,OAAA,EAAS,EAAE,IAAA,EAAM,4BAA4B,CAAA;AAAA,QACnE,aAAA,CAAc,UAAU,MAAM,CAAA;AAAA,QAC9B,cAAc,QAAA,EAAU,MAAA,EAAQ,EAAE,IAAA,EAAM,wBAAwB,CAAA;AAAA,QAChE,cAAc,QAAA,EAAU,IAAA,EAAM,EAAE,IAAA,EAAM,wBAAwB,CAAA;AAAA,QAC9D,cAAc,QAAA,EAAU,KAAA,EAAO,EAAE,IAAA,EAAM,wBAAwB,CAAA;AAAA,QAC/D,aAAA,CAAc,SAAA,EAAW,cAAA,EAAgB,WAAA,EAAa,CAAA;AAAA,QACtD,aAAA,CAAc,UAAA,EAAY,cAAA,EAAgB,WAAA,EAAa;AAAA;AACzD;AACF;AAEJ,CAAC;AAED,SAAS,IAAA,CACP,IAAA,EACA,UAAA,EACA,QAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY,EAAE,IAAA,EAAM,EAAE,OAAO,IAAA,EAAK,EAAG,GAAG,UAAA,EAAW;AAAA,IACnD,QAAA,EAAU,CAAC,MAAA,EAAQ,GAAG,QAAQ,CAAA;AAAA,IAC9B,oBAAA,EAAsB;AAAA,GACxB;AACF;AAEA,SAAS,YAAA,CAAa,MAAc,SAAA,EAAuD;AACzF,EAAA,OAAO,IAAA;AAAA,IACL,IAAA;AAAA,IACA,EAAE,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAU,EAAG,IAAA,EAAM,aAAA,EAAc,EAAG,KAAA,EAAO,aAAA,EAAc,EAAE;AAAA,IAC/E,CAAC,UAAA,EAAY,MAAA,EAAQ,OAAO;AAAA,GAC9B;AACF;AAEA,SAAS,WAAA,GAAuC;AAC9C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,SAAS,MAAA,CAAO,gBAAA;AAAA,IAChB,SAAS,MAAA,CAAO;AAAA,GAClB;AACF;AAEA,SAAS,SAAA,CACP,MACA,IAAA,EACyB;AACzB,EAAA,OAAO,IAAA;AAAA,IACL,OAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,MACpB,OAAO,aAAA,EAAc;AAAA,MACrB,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,aAAa,IAAA,EAAM,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,CAAA;AAAE,KACrE;AAAA,IACA,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAM;AAAA,GAC1B;AACF;AAEA,SAAS,GAAA,CAAI,SAAiB,OAAA,EAA2C;AACvE,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA,EAAQ;AAAA,IAC1B,MAAM,aAAA;AAAc,GACtB;AACA,EAAA,IAAI,OAAA,EAAS,UAAA,CAAW,OAAA,GAAU,WAAA,EAAY;AAC9C,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,CAAC,SAAA,EAAW,MAAM,CAAA,EAAG,oBAAA,EAAsB,KAAA,EAAM;AAClG;AAEA,SAAS,aAAA,CACP,IAAA,EACA,OAAA,EACA,KAAA,EACyB;AACzB,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,MAAA,EAAQ,EAAE,KAAA,EAAO,cAAA,EAAe;AAAA,IAChC,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,IACpB,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,IACpB,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA;AAAQ,GAC5B;AACA,EAAA,IAAI,KAAA,aAAkB,KAAA,GAAQ,KAAA;AAC9B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,UAAA;AAAA,IACA,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,IAChC,oBAAA,EAAsB;AAAA,GACxB;AACF;AAEA,SAAS,aAAA,GAAwC;AAC/C,EAAA,OAAO,EAAE,MAAM,oBAAA,EAAqB;AACtC;AAEA,SAAS,WAAA,GAAuC;AAC9C,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,CAAA,EAAG,SAAA,EAAW,yBAAyB,kBAAA,EAAmB;AAChG;AAEA,SAAS,WAAc,KAAA,EAAa;AAClC,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAClF,EAAA,KAAA,MAAW,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,aAAc,KAAK,CAAA;AAC1D,EAAA,OAAO,MAAA,CAAO,OAAO,KAAK,CAAA;AAC5B","file":"schemas.js","sourcesContent":["import { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\n\nexport type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;\n\nconst jsonValue = jsonValueSchema(\"#/$defs/jsonValue\", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);\nconst encodedJsonValue = jsonValueSchema(\n \"#/$defs/encodedJsonValue\",\n DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2,\n);\n\nfunction jsonValueSchema(reference: string, maxContainerSize: number): Record<string, unknown> {\n return {\n anyOf: [\n { type: \"null\" },\n { type: \"boolean\" },\n { type: \"number\", minimum: -1.7976931348623157e308, maximum: 1.7976931348623157e308 },\n { type: \"string\", maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n {\n type: \"array\",\n maxItems: maxContainerSize,\n items: { $ref: reference },\n },\n {\n type: \"object\",\n maxProperties: maxContainerSize,\n propertyNames: {\n allOf: [\n { maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n { not: { enum: [\"__proto__\", \"constructor\", \"prototype\"] } },\n ],\n },\n additionalProperties: { $ref: reference },\n },\n ],\n };\n}\n\nconst expression = {\n oneOf: [\n node(\"literal\", { value: { $ref: \"#/$defs/jsonValue\" } }, [\"value\"]),\n node(\n \"ref\",\n {\n ref: {\n type: \"string\",\n minLength: 1,\n maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength,\n },\n },\n [\"ref\"],\n ),\n node(\"binding\", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [\n \"name\",\n \"value\",\n \"body\",\n ]),\n node(\"option\", { variant: { const: \"none\" } }, [\"variant\"]),\n node(\"option\", { variant: { const: \"some\" }, value: expressionRef() }, [\"variant\", \"value\"]),\n node(\"result\", { variant: { enum: [\"ok\", \"err\"] }, value: expressionRef() }, [\n \"variant\",\n \"value\",\n ]),\n node(\"instant\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"duration\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"current-instant\", {}, []),\n temporalNode(\"temporal-arithmetic\", [\"add\", \"subtract\"]),\n temporalNode(\"temporal-comparison\", [\n \"equal\",\n \"not-equal\",\n \"less-than\",\n \"less-than-or-equal\",\n \"greater-than\",\n \"greater-than-or-equal\",\n ]),\n matchNode(\"Option\", [arm(\"some\", true), arm(\"none\", false)]),\n matchNode(\"Result\", [arm(\"ok\", true), arm(\"err\", true)]),\n ],\n};\n\nexport const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: { jsonValue, expression },\n});\n\nexport const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/value/kalada-value-v1\",\n $ref: \"#/$defs/encodedValue\",\n $defs: {\n encodedJsonValue,\n encodedValue: {\n oneOf: [\n valueEnvelope(\"Json\", \"value\", { $ref: \"#/$defs/encodedJsonValue\" }),\n valueEnvelope(\"Option\", \"none\"),\n valueEnvelope(\"Option\", \"some\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"ok\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"err\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Instant\", \"milliseconds\", safeInteger()),\n valueEnvelope(\"Duration\", \"milliseconds\", safeInteger()),\n ],\n },\n },\n});\n\nfunction node(\n kind: string,\n properties: Record<string, unknown>,\n required: string[],\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties: { kind: { const: kind }, ...properties },\n required: [\"kind\", ...required],\n additionalProperties: false,\n };\n}\n\nfunction temporalNode(kind: string, operators: readonly string[]): Record<string, unknown> {\n return node(\n kind,\n { operator: { enum: operators }, left: expressionRef(), right: expressionRef() },\n [\"operator\", \"left\", \"right\"],\n );\n}\n\nfunction safeInteger(): Record<string, unknown> {\n return {\n type: \"integer\",\n minimum: Number.MIN_SAFE_INTEGER,\n maximum: Number.MAX_SAFE_INTEGER,\n };\n}\n\nfunction matchNode(\n type: \"Option\" | \"Result\",\n arms: readonly Record<string, unknown>[],\n): Record<string, unknown> {\n return node(\n \"match\",\n {\n type: { const: type },\n value: expressionRef(),\n arms: { type: \"array\", prefixItems: arms, minItems: 2, maxItems: 2 },\n },\n [\"type\", \"value\", \"arms\"],\n );\n}\n\nfunction arm(variant: string, payload: boolean): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n variant: { const: variant },\n body: expressionRef(),\n };\n if (payload) properties.binding = bindingName();\n return { type: \"object\", properties, required: [\"variant\", \"body\"], additionalProperties: false };\n}\n\nfunction valueEnvelope(\n type: string,\n variant: string,\n value?: Record<string, unknown>,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n format: { const: \"kalada-value\" },\n version: { const: 1 },\n type: { const: type },\n variant: { const: variant },\n };\n if (value) properties.value = value;\n return {\n type: \"object\",\n properties,\n required: Object.keys(properties),\n additionalProperties: false,\n };\n}\n\nfunction expressionRef(): Record<string, string> {\n return { $ref: \"#/$defs/expression\" };\n}\n\nfunction bindingName(): Record<string, unknown> {\n return { type: \"string\", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const child of Object.values(value)) deepFreeze(child);\n return Object.freeze(value);\n}\n"]}