@kalada/core 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +62 -3
  2. package/dist/kalada-v1/canonical-input.cjs.map +1 -1
  3. package/dist/kalada-v1/canonical-input.d.cts +3 -2
  4. package/dist/kalada-v1/canonical-input.d.ts +3 -2
  5. package/dist/kalada-v1/canonical-input.js.map +1 -1
  6. package/dist/kalada-v1/canonicalize.cjs +16 -1
  7. package/dist/kalada-v1/canonicalize.cjs.map +1 -1
  8. package/dist/kalada-v1/canonicalize.js +16 -1
  9. package/dist/kalada-v1/canonicalize.js.map +1 -1
  10. package/dist/kalada-v1/compile.cjs +13 -4
  11. package/dist/kalada-v1/compile.cjs.map +1 -1
  12. package/dist/kalada-v1/compile.js +14 -5
  13. package/dist/kalada-v1/compile.js.map +1 -1
  14. package/dist/kalada-v1/dependencies.cjs +49 -2
  15. package/dist/kalada-v1/dependencies.cjs.map +1 -1
  16. package/dist/kalada-v1/dependencies.js +49 -2
  17. package/dist/kalada-v1/dependencies.js.map +1 -1
  18. package/dist/kalada-v1/diagnostics.cjs +24 -4
  19. package/dist/kalada-v1/diagnostics.cjs.map +1 -1
  20. package/dist/kalada-v1/diagnostics.d.cts +4 -3
  21. package/dist/kalada-v1/diagnostics.d.ts +4 -3
  22. package/dist/kalada-v1/diagnostics.js +24 -4
  23. package/dist/kalada-v1/diagnostics.js.map +1 -1
  24. package/dist/kalada-v1/evaluate.cjs +10 -139
  25. package/dist/kalada-v1/evaluate.cjs.map +1 -1
  26. package/dist/kalada-v1/evaluate.d.cts +3 -2
  27. package/dist/kalada-v1/evaluate.d.ts +3 -2
  28. package/dist/kalada-v1/evaluate.js +12 -141
  29. package/dist/kalada-v1/evaluate.js.map +1 -1
  30. package/dist/kalada-v1/evaluation-delivery.cjs +286 -0
  31. package/dist/kalada-v1/evaluation-delivery.cjs.map +1 -0
  32. package/dist/kalada-v1/evaluation-delivery.d.cts +13 -0
  33. package/dist/kalada-v1/evaluation-delivery.d.ts +13 -0
  34. package/dist/kalada-v1/evaluation-delivery.js +284 -0
  35. package/dist/kalada-v1/evaluation-delivery.js.map +1 -0
  36. package/dist/kalada-v1/evaluation-frames.cjs +16 -0
  37. package/dist/kalada-v1/evaluation-frames.cjs.map +1 -0
  38. package/dist/kalada-v1/evaluation-frames.d.cts +83 -0
  39. package/dist/kalada-v1/evaluation-frames.d.ts +83 -0
  40. package/dist/kalada-v1/evaluation-frames.js +14 -0
  41. package/dist/kalada-v1/evaluation-frames.js.map +1 -0
  42. package/dist/kalada-v1/evaluation-machine.cjs +226 -0
  43. package/dist/kalada-v1/evaluation-machine.cjs.map +1 -0
  44. package/dist/kalada-v1/evaluation-machine.d.cts +9 -0
  45. package/dist/kalada-v1/evaluation-machine.d.ts +9 -0
  46. package/dist/kalada-v1/evaluation-machine.js +224 -0
  47. package/dist/kalada-v1/evaluation-machine.js.map +1 -0
  48. package/dist/kalada-v1/evaluation-resolution.cjs +80 -0
  49. package/dist/kalada-v1/evaluation-resolution.cjs.map +1 -0
  50. package/dist/kalada-v1/evaluation-resolution.d.cts +11 -0
  51. package/dist/kalada-v1/evaluation-resolution.d.ts +11 -0
  52. package/dist/kalada-v1/evaluation-resolution.js +78 -0
  53. package/dist/kalada-v1/evaluation-resolution.js.map +1 -0
  54. package/dist/kalada-v1/evaluation-state.cjs +94 -0
  55. package/dist/kalada-v1/evaluation-state.cjs.map +1 -0
  56. package/dist/kalada-v1/evaluation-state.d.cts +38 -0
  57. package/dist/kalada-v1/evaluation-state.d.ts +38 -0
  58. package/dist/kalada-v1/evaluation-state.js +81 -0
  59. package/dist/kalada-v1/evaluation-state.js.map +1 -0
  60. package/dist/kalada-v1/factories.cjs +28 -0
  61. package/dist/kalada-v1/factories.cjs.map +1 -1
  62. package/dist/kalada-v1/factories.d.cts +16 -1
  63. package/dist/kalada-v1/factories.d.ts +16 -1
  64. package/dist/kalada-v1/factories.js +28 -0
  65. package/dist/kalada-v1/factories.js.map +1 -1
  66. package/dist/kalada-v1/function-contracts.cjs +150 -0
  67. package/dist/kalada-v1/function-contracts.cjs.map +1 -0
  68. package/dist/kalada-v1/function-contracts.d.cts +15 -0
  69. package/dist/kalada-v1/function-contracts.d.ts +15 -0
  70. package/dist/kalada-v1/function-contracts.js +144 -0
  71. package/dist/kalada-v1/function-contracts.js.map +1 -0
  72. package/dist/kalada-v1/index.cjs +13 -0
  73. package/dist/kalada-v1/index.d.cts +4 -3
  74. package/dist/kalada-v1/index.d.ts +4 -3
  75. package/dist/kalada-v1/index.js +3 -2
  76. package/dist/kalada-v1/limits.cjs +23 -2
  77. package/dist/kalada-v1/limits.cjs.map +1 -1
  78. package/dist/kalada-v1/limits.d.cts +5 -3
  79. package/dist/kalada-v1/limits.d.ts +5 -3
  80. package/dist/kalada-v1/limits.js +23 -3
  81. package/dist/kalada-v1/limits.js.map +1 -1
  82. package/dist/kalada-v1/runtime-values.cjs +112 -0
  83. package/dist/kalada-v1/runtime-values.cjs.map +1 -0
  84. package/dist/kalada-v1/runtime-values.d.cts +35 -0
  85. package/dist/kalada-v1/runtime-values.d.ts +35 -0
  86. package/dist/kalada-v1/runtime-values.js +105 -0
  87. package/dist/kalada-v1/runtime-values.js.map +1 -0
  88. package/dist/kalada-v1/schemas.cjs +107 -2
  89. package/dist/kalada-v1/schemas.cjs.map +1 -1
  90. package/dist/kalada-v1/schemas.d.cts +2 -1
  91. package/dist/kalada-v1/schemas.d.ts +2 -1
  92. package/dist/kalada-v1/schemas.js +108 -4
  93. package/dist/kalada-v1/schemas.js.map +1 -1
  94. package/dist/kalada-v1/static-analysis.cjs +177 -0
  95. package/dist/kalada-v1/static-analysis.cjs.map +1 -0
  96. package/dist/kalada-v1/static-analysis.d.cts +9 -0
  97. package/dist/kalada-v1/static-analysis.d.ts +9 -0
  98. package/dist/kalada-v1/static-analysis.js +175 -0
  99. package/dist/kalada-v1/static-analysis.js.map +1 -0
  100. package/dist/kalada-v1/static-types.cjs +229 -0
  101. package/dist/kalada-v1/static-types.cjs.map +1 -0
  102. package/dist/kalada-v1/static-types.d.cts +8 -0
  103. package/dist/kalada-v1/static-types.d.ts +8 -0
  104. package/dist/kalada-v1/static-types.js +227 -0
  105. package/dist/kalada-v1/static-types.js.map +1 -0
  106. package/dist/kalada-v1/temporal-evaluation.cjs +21 -0
  107. package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -1
  108. package/dist/kalada-v1/temporal-evaluation.d.cts +7 -2
  109. package/dist/kalada-v1/temporal-evaluation.d.ts +7 -2
  110. package/dist/kalada-v1/temporal-evaluation.js +20 -1
  111. package/dist/kalada-v1/temporal-evaluation.js.map +1 -1
  112. package/dist/kalada-v1/types.d.cts +78 -4
  113. package/dist/kalada-v1/types.d.ts +78 -4
  114. package/package.json +1 -1
@@ -1,9 +1,10 @@
1
1
  import { rejectCallbackPromise } from '../kuery-v1/callback-promise.js';
2
2
  import { canonicalizeKaladaV1Program } from './canonicalize.js';
3
3
  import { collectKaladaV1Dependencies } from './dependencies.js';
4
- import { failure, success } from './diagnostics.js';
4
+ import { failure, KaladaFailure, success } from './diagnostics.js';
5
5
  import { evaluateKaladaV1 } from './evaluate.js';
6
6
  import { resolveLimits } from './limits.js';
7
+ import { analyzeKaladaV1Functions } from './static-analysis.js';
7
8
  import { isInstant } from './temporal.js';
8
9
 
9
10
  function compileKaladaV1Program(input, options = {}) {
@@ -16,17 +17,25 @@ function compileKaladaV1Program(input, options = {}) {
16
17
  return failure("KALADA_LIMIT_EXCEEDED", []);
17
18
  }
18
19
  const program = canonical.value;
20
+ let functions;
21
+ try {
22
+ functions = analyzeKaladaV1Functions(program.expression, limits);
23
+ } catch (error) {
24
+ const problem = error instanceof KaladaFailure ? error : new KaladaFailure("KALADA_INVALID_INPUT", []);
25
+ return failure(problem.code, problem.path);
26
+ }
19
27
  const dependencies = collectKaladaV1Dependencies(program.expression);
20
28
  return success(
21
29
  Object.freeze({
22
30
  program,
23
31
  dependencies,
24
- evaluate: (resolve, inputs) => evaluateKaladaV1(program.expression, resolve, limits, inputs),
25
- evaluateWithClock: (resolve, clock) => evaluateWithClock(program.expression, resolve, limits, clock)
32
+ functions,
33
+ evaluate: (resolve, inputs) => evaluateKaladaV1(program.expression, resolve, limits, functions, inputs),
34
+ evaluateWithClock: (resolve, clock) => evaluateWithClock(program.expression, resolve, limits, functions, clock)
26
35
  })
27
36
  );
28
37
  }
29
- function evaluateWithClock(expression, resolve, limits, clock) {
38
+ function evaluateWithClock(expression, resolve, limits, functions, clock) {
30
39
  let sample;
31
40
  try {
32
41
  sample = clock();
@@ -35,7 +44,7 @@ function evaluateWithClock(expression, resolve, limits, clock) {
35
44
  }
36
45
  if (rejectCallbackPromise(sample)) return failure("KALADA_ASYNC_UNSUPPORTED", ["clock"]);
37
46
  if (!isInstant(sample)) return failure("KALADA_INVALID_CLOCK", ["clock"]);
38
- return evaluateKaladaV1(expression, resolve, limits, { instant: sample });
47
+ return evaluateKaladaV1(expression, resolve, limits, functions, { instant: sample });
39
48
  }
40
49
 
41
50
  export { compileKaladaV1Program };
@@ -1 +1 @@
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"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/compile.ts"],"names":[],"mappings":";;;;;;;;;AAmBO,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,IAAI,SAAA;AACJ,EAAA,IAAI;AACF,IAAA,SAAA,GAAY,wBAAA,CAAyB,OAAA,CAAQ,UAAA,EAAY,MAAM,CAAA;AAAA,EACjE,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GACJ,iBAAiB,aAAA,GAAgB,KAAA,GAAQ,IAAI,aAAA,CAAc,sBAAA,EAAwB,EAAE,CAAA;AACvF,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC3C;AACA,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,SAAA;AAAA,MACA,QAAA,EAAU,CAAC,OAAA,EAA8B,MAAA,KACvC,gBAAA,CAAiB,QAAQ,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAA;AAAA,MACzE,iBAAA,EAAmB,CAAC,OAAA,EAA8B,KAAA,KAChD,iBAAA,CAAkB,QAAQ,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,KAAK;AAAA,KAC1E;AAAA,GACH;AACF;AAEA,SAAS,iBAAA,CACP,UAAA,EACA,OAAA,EACA,MAAA,EACA,WACA,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,gBAAA,CAAiB,YAAY,OAAA,EAAS,MAAA,EAAQ,WAAW,EAAE,OAAA,EAAS,QAAQ,CAAA;AACrF","file":"compile.js","sourcesContent":["import { rejectCallbackPromise } from \"../kuery-v1/callback-promise.js\";\nimport { canonicalizeKaladaV1Program } from \"./canonicalize.js\";\nimport { collectKaladaV1Dependencies } from \"./dependencies.js\";\nimport { failure, KaladaFailure, success } from \"./diagnostics.js\";\nimport { evaluateKaladaV1 } from \"./evaluate.js\";\nimport type { JsonValue } from \"./json.js\";\nimport { type ResolvedKaladaV1Limits, resolveLimits } from \"./limits.js\";\nimport { analyzeKaladaV1Functions } from \"./static-analysis.js\";\nimport { isInstant } from \"./temporal.js\";\nimport type {\n CompiledKaladaV1Program,\n KaladaV1Clock,\n KaladaV1EvaluationInputs,\n KaladaV1FunctionCapture,\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: ResolvedKaladaV1Limits;\n try {\n limits = resolveLimits(options.limits);\n } catch {\n return failure(\"KALADA_LIMIT_EXCEEDED\", []);\n }\n const program = canonical.value;\n let functions: readonly KaladaV1FunctionCapture[];\n try {\n functions = analyzeKaladaV1Functions(program.expression, limits);\n } catch (error) {\n const problem =\n error instanceof KaladaFailure ? error : new KaladaFailure(\"KALADA_INVALID_INPUT\", []);\n return failure(problem.code, problem.path);\n }\n const dependencies = collectKaladaV1Dependencies(program.expression);\n return success(\n Object.freeze({\n program,\n dependencies,\n functions,\n evaluate: (resolve: KaladaV1Resolver<R>, inputs?: KaladaV1EvaluationInputs) =>\n evaluateKaladaV1(program.expression, resolve, limits, functions, inputs),\n evaluateWithClock: (resolve: KaladaV1Resolver<R>, clock: KaladaV1Clock) =>\n evaluateWithClock(program.expression, resolve, limits, functions, clock),\n }),\n );\n}\n\nfunction evaluateWithClock<R extends JsonValue>(\n expression: Parameters<typeof evaluateKaladaV1<R>>[0],\n resolve: KaladaV1Resolver<R>,\n limits: ResolvedKaladaV1Limits,\n functions: readonly KaladaV1FunctionCapture[],\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, functions, { instant: sample });\n}\n"]}
@@ -13,12 +13,13 @@ 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 === "instant" || node.kind === "duration" || node.kind === "current-instant" || node.kind === "option" && node.variant === "none")
16
+ if (node.kind === "literal" || node.kind === "instant" || node.kind === "duration" || node.kind === "current-instant" || node.kind === "core-function" || node.kind === "option" && node.variant === "none")
17
17
  return;
18
18
  if (node.kind === "binding") {
19
19
  visitBinding(node, scope, output, identities);
20
20
  return;
21
21
  }
22
+ if (visitFunctionNode(node, scope, output, identities)) return;
22
23
  if (node.kind === "match") {
23
24
  visitMatch(node.value, node.arms, scope, output, identities);
24
25
  return;
@@ -28,7 +29,48 @@ function visit(node, scope, output, identities) {
28
29
  visit(node.right, scope, output, identities);
29
30
  return;
30
31
  }
31
- visit(node.value, scope, output, identities);
32
+ if (node.kind === "option" || node.kind === "result") {
33
+ visit(node.value, scope, output, identities);
34
+ }
35
+ }
36
+ function visitFunctionNode(node, scope, output, identities) {
37
+ if (node.kind === "function") {
38
+ visit(
39
+ node.body,
40
+ extendedMany(
41
+ scope,
42
+ node.parameters.map((parameter) => parameter.name)
43
+ ),
44
+ output,
45
+ identities
46
+ );
47
+ return true;
48
+ }
49
+ if (node.kind === "function-group") {
50
+ const groupScope = extendedMany(
51
+ scope,
52
+ node.functions.map((member) => member.name)
53
+ );
54
+ for (const member of node.functions) {
55
+ visit(
56
+ member.body,
57
+ extendedMany(
58
+ groupScope,
59
+ member.parameters.map((parameter) => parameter.name)
60
+ ),
61
+ output,
62
+ identities
63
+ );
64
+ }
65
+ visit(node.body, groupScope, output, identities);
66
+ return true;
67
+ }
68
+ if (node.kind === "call") {
69
+ visit(node.callee, scope, output, identities);
70
+ for (const argument of node.arguments) visit(argument, scope, output, identities);
71
+ return true;
72
+ }
73
+ return false;
32
74
  }
33
75
  function visitBinding(node, scope, output, identities) {
34
76
  visit(node.value, scope, output, identities);
@@ -52,6 +94,11 @@ function extended(scope, name) {
52
94
  output.add(name);
53
95
  return output;
54
96
  }
97
+ function extendedMany(scope, names) {
98
+ const output = new Set(scope);
99
+ for (const name of names) output.add(name);
100
+ return output;
101
+ }
55
102
 
56
103
  exports.collectKaladaV1Dependencies = collectKaladaV1Dependencies;
57
104
  //# sourceMappingURL=dependencies.cjs.map
@@ -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,IACE,KAAK,IAAA,KAAS,SAAA,IACd,IAAA,CAAK,IAAA,KAAS,aACd,IAAA,CAAK,IAAA,KAAS,UAAA,IACd,IAAA,CAAK,SAAS,iBAAA,IACb,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,KAAK,OAAA,KAAY,MAAA;AAE5C,IAAA;AACF,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,IAAI,IAAA,CAAK,IAAA,KAAS,qBAAA,IAAyB,IAAA,CAAK,SAAS,qBAAA,EAAuB;AAC9E,IAAA,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC1C,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC3C,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 (\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
+ {"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 === \"core-function\" ||\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 (visitFunctionNode(node, scope, output, identities)) 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 if (node.kind === \"option\" || node.kind === \"result\") {\n visit(node.value, scope, output, identities);\n }\n}\n\nfunction visitFunctionNode<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): boolean {\n if (node.kind === \"function\") {\n visit(\n node.body,\n extendedMany(\n scope,\n node.parameters.map((parameter) => parameter.name),\n ),\n output,\n identities,\n );\n return true;\n }\n if (node.kind === \"function-group\") {\n const groupScope = extendedMany(\n scope,\n node.functions.map((member) => member.name),\n );\n for (const member of node.functions) {\n visit(\n member.body,\n extendedMany(\n groupScope,\n member.parameters.map((parameter) => parameter.name),\n ),\n output,\n identities,\n );\n }\n visit(node.body, groupScope, output, identities);\n return true;\n }\n if (node.kind === \"call\") {\n visit(node.callee, scope, output, identities);\n for (const argument of node.arguments) visit(argument, scope, output, identities);\n return true;\n }\n return false;\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\nfunction extendedMany(scope: ReadonlySet<string>, names: readonly string[]): ReadonlySet<string> {\n const output = new Set(scope);\n for (const name of names) output.add(name);\n return output;\n}\n"]}
@@ -11,12 +11,13 @@ 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 === "instant" || node.kind === "duration" || node.kind === "current-instant" || node.kind === "option" && node.variant === "none")
14
+ if (node.kind === "literal" || node.kind === "instant" || node.kind === "duration" || node.kind === "current-instant" || node.kind === "core-function" || node.kind === "option" && node.variant === "none")
15
15
  return;
16
16
  if (node.kind === "binding") {
17
17
  visitBinding(node, scope, output, identities);
18
18
  return;
19
19
  }
20
+ if (visitFunctionNode(node, scope, output, identities)) return;
20
21
  if (node.kind === "match") {
21
22
  visitMatch(node.value, node.arms, scope, output, identities);
22
23
  return;
@@ -26,7 +27,48 @@ function visit(node, scope, output, identities) {
26
27
  visit(node.right, scope, output, identities);
27
28
  return;
28
29
  }
29
- visit(node.value, scope, output, identities);
30
+ if (node.kind === "option" || node.kind === "result") {
31
+ visit(node.value, scope, output, identities);
32
+ }
33
+ }
34
+ function visitFunctionNode(node, scope, output, identities) {
35
+ if (node.kind === "function") {
36
+ visit(
37
+ node.body,
38
+ extendedMany(
39
+ scope,
40
+ node.parameters.map((parameter) => parameter.name)
41
+ ),
42
+ output,
43
+ identities
44
+ );
45
+ return true;
46
+ }
47
+ if (node.kind === "function-group") {
48
+ const groupScope = extendedMany(
49
+ scope,
50
+ node.functions.map((member) => member.name)
51
+ );
52
+ for (const member of node.functions) {
53
+ visit(
54
+ member.body,
55
+ extendedMany(
56
+ groupScope,
57
+ member.parameters.map((parameter) => parameter.name)
58
+ ),
59
+ output,
60
+ identities
61
+ );
62
+ }
63
+ visit(node.body, groupScope, output, identities);
64
+ return true;
65
+ }
66
+ if (node.kind === "call") {
67
+ visit(node.callee, scope, output, identities);
68
+ for (const argument of node.arguments) visit(argument, scope, output, identities);
69
+ return true;
70
+ }
71
+ return false;
30
72
  }
31
73
  function visitBinding(node, scope, output, identities) {
32
74
  visit(node.value, scope, output, identities);
@@ -50,6 +92,11 @@ function extended(scope, name) {
50
92
  output.add(name);
51
93
  return output;
52
94
  }
95
+ function extendedMany(scope, names) {
96
+ const output = new Set(scope);
97
+ for (const name of names) output.add(name);
98
+ return output;
99
+ }
53
100
 
54
101
  export { collectKaladaV1Dependencies };
55
102
  //# sourceMappingURL=dependencies.js.map
@@ -1 +1 @@
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"]}
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 === \"core-function\" ||\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 (visitFunctionNode(node, scope, output, identities)) 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 if (node.kind === \"option\" || node.kind === \"result\") {\n visit(node.value, scope, output, identities);\n }\n}\n\nfunction visitFunctionNode<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): boolean {\n if (node.kind === \"function\") {\n visit(\n node.body,\n extendedMany(\n scope,\n node.parameters.map((parameter) => parameter.name),\n ),\n output,\n identities,\n );\n return true;\n }\n if (node.kind === \"function-group\") {\n const groupScope = extendedMany(\n scope,\n node.functions.map((member) => member.name),\n );\n for (const member of node.functions) {\n visit(\n member.body,\n extendedMany(\n groupScope,\n member.parameters.map((parameter) => parameter.name),\n ),\n output,\n identities,\n );\n }\n visit(node.body, groupScope, output, identities);\n return true;\n }\n if (node.kind === \"call\") {\n visit(node.callee, scope, output, identities);\n for (const argument of node.arguments) visit(argument, scope, output, identities);\n return true;\n }\n return false;\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\nfunction extendedMany(scope: ReadonlySet<string>, names: readonly string[]): ReadonlySet<string> {\n const output = new Set(scope);\n for (const name of names) output.add(name);\n return output;\n}\n"]}
@@ -19,25 +19,45 @@ const MESSAGES = Object.freeze({
19
19
  KALADA_TEMPORAL_TYPE_MISMATCH: "Kalada temporal operation received incompatible values.",
20
20
  KALADA_TEMPORAL_OVERFLOW: "Kalada temporal arithmetic exceeded safe integer milliseconds.",
21
21
  KALADA_CLOCK_ERROR: "Kalada clock sampling failed.",
22
- KALADA_INVALID_CLOCK: "Kalada clock returned an invalid Instant."
22
+ KALADA_INVALID_CLOCK: "Kalada clock returned an invalid Instant.",
23
+ KALADA_DUPLICATE_BINDING: "Kalada function contains a duplicate binding.",
24
+ KALADA_INVALID_FUNCTION_TYPE: "Kalada function type is invalid.",
25
+ KALADA_CAPTURE_LIMIT: "Kalada function captures exceed a configured limit.",
26
+ KALADA_NOT_CALLABLE: "Kalada call target is not callable.",
27
+ KALADA_FUNCTION_ARITY: "Kalada call has the wrong number of arguments.",
28
+ KALADA_FUNCTION_TYPE_MISMATCH: "Kalada function type does not match.",
29
+ KALADA_CLOSURE_LIMIT: "Kalada closure count exceeds a configured limit.",
30
+ KALADA_CALL_DEPTH_LIMIT: "Kalada call depth exceeds a configured limit.",
31
+ KALADA_CONTINUATION_LIMIT: "Kalada continuation count exceeds a configured limit.",
32
+ KALADA_COLLECTION_TYPE_MISMATCH: "Kalada collection function received an incompatible value.",
33
+ KALADA_COLLECTION_LIMIT: "Kalada collection exceeds a configured limit.",
34
+ KALADA_FUNCTION_ESCAPE: "Kalada callable cannot escape evaluation."
23
35
  });
24
36
  class KaladaFailure extends Error {
25
37
  code;
26
38
  path;
27
- constructor(code, path) {
39
+ context;
40
+ constructor(code, path, context) {
28
41
  super(code);
29
42
  this.code = code;
30
43
  this.path = path;
44
+ this.context = context;
31
45
  }
32
46
  }
33
- function failure(code, path) {
47
+ function failure(code, path, context) {
34
48
  const diagnostic = Object.freeze({
35
49
  code,
36
50
  path: Object.freeze([...path]),
37
- message: MESSAGES[code]
51
+ message: MESSAGES[code],
52
+ ...context === void 0 ? {} : { context: freezeContext(context) }
38
53
  });
39
54
  return Object.freeze({ ok: false, diagnostic });
40
55
  }
56
+ function freezeContext(context) {
57
+ return Object.freeze(
58
+ context.map((frame) => Object.freeze({ ...frame, path: Object.freeze([...frame.path]) }))
59
+ );
60
+ }
41
61
  function success(value) {
42
62
  return Object.freeze({ ok: true, value });
43
63
  }
@@ -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,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
+ {"version":3,"sources":["../../src/kalada-v1/diagnostics.ts"],"names":[],"mappings":";;AAOA,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,2CAAA;AAAA,EACtB,wBAAA,EAA0B,+CAAA;AAAA,EAC1B,4BAAA,EAA8B,kCAAA;AAAA,EAC9B,oBAAA,EAAsB,qDAAA;AAAA,EACtB,mBAAA,EAAqB,qCAAA;AAAA,EACrB,qBAAA,EAAuB,gDAAA;AAAA,EACvB,6BAAA,EAA+B,sCAAA;AAAA,EAC/B,oBAAA,EAAsB,kDAAA;AAAA,EACtB,uBAAA,EAAyB,+CAAA;AAAA,EACzB,yBAAA,EAA2B,uDAAA;AAAA,EAC3B,+BAAA,EAAiC,4DAAA;AAAA,EACjC,uBAAA,EAAyB,+CAAA;AAAA,EACzB,sBAAA,EAAwB;AAC1B,CAAC,CAAA;AAEM,MAAM,sBAAsB,KAAA,CAAM;AAAA,EAC9B,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EAET,WAAA,CACE,IAAA,EACA,IAAA,EACA,OAAA,EACA;AACA,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF;AAEO,SAAS,OAAA,CACd,IAAA,EACA,IAAA,EACA,OAAA,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,CAAA;AAAA,IACtB,GAAI,YAAY,MAAA,GAAY,KAAK,EAAE,OAAA,EAAS,aAAA,CAAc,OAAO,CAAA;AAAE,GACpE,CAAA;AACD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,KAAA,EAAO,YAAY,CAAA;AAChD;AAEA,SAAS,cACP,OAAA,EAC2C;AAC3C,EAAA,OAAO,MAAA,CAAO,MAAA;AAAA,IACZ,QAAQ,GAAA,CAAI,CAAC,UAAU,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,KAAA,EAAO,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,CAAC;AAAA,GAC1F;AACF;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 {\n KaladaV1Diagnostic,\n KaladaV1DiagnosticCode,\n KaladaV1DiagnosticContextFrame,\n KaladaV1Outcome,\n} 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 KALADA_DUPLICATE_BINDING: \"Kalada function contains a duplicate binding.\",\n KALADA_INVALID_FUNCTION_TYPE: \"Kalada function type is invalid.\",\n KALADA_CAPTURE_LIMIT: \"Kalada function captures exceed a configured limit.\",\n KALADA_NOT_CALLABLE: \"Kalada call target is not callable.\",\n KALADA_FUNCTION_ARITY: \"Kalada call has the wrong number of arguments.\",\n KALADA_FUNCTION_TYPE_MISMATCH: \"Kalada function type does not match.\",\n KALADA_CLOSURE_LIMIT: \"Kalada closure count exceeds a configured limit.\",\n KALADA_CALL_DEPTH_LIMIT: \"Kalada call depth exceeds a configured limit.\",\n KALADA_CONTINUATION_LIMIT: \"Kalada continuation count exceeds a configured limit.\",\n KALADA_COLLECTION_TYPE_MISMATCH: \"Kalada collection function received an incompatible value.\",\n KALADA_COLLECTION_LIMIT: \"Kalada collection exceeds a configured limit.\",\n KALADA_FUNCTION_ESCAPE: \"Kalada callable cannot escape evaluation.\",\n});\n\nexport class KaladaFailure extends Error {\n readonly code: KaladaV1DiagnosticCode;\n readonly path: readonly (string | number)[];\n readonly context?: readonly KaladaV1DiagnosticContextFrame[];\n\n constructor(\n code: KaladaV1DiagnosticCode,\n path: readonly (string | number)[],\n context?: readonly KaladaV1DiagnosticContextFrame[],\n ) {\n super(code);\n this.code = code;\n this.path = path;\n this.context = context;\n }\n}\n\nexport function failure<T>(\n code: KaladaV1DiagnosticCode,\n path: readonly (string | number)[],\n context?: readonly KaladaV1DiagnosticContextFrame[],\n): KaladaV1Outcome<T> {\n const diagnostic: KaladaV1Diagnostic = Object.freeze({\n code,\n path: Object.freeze([...path]),\n message: MESSAGES[code],\n ...(context === undefined ? {} : { context: freezeContext(context) }),\n });\n return Object.freeze({ ok: false, diagnostic });\n}\n\nfunction freezeContext(\n context: readonly KaladaV1DiagnosticContextFrame[],\n): readonly KaladaV1DiagnosticContextFrame[] {\n return Object.freeze(\n context.map((frame) => Object.freeze({ ...frame, path: Object.freeze([...frame.path]) })),\n );\n}\n\nexport function success<T>(value: T): KaladaV1Outcome<T> {\n return Object.freeze({ ok: true, value });\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { KaladaV1DiagnosticCode, KaladaV1Outcome } from './types.cjs';
1
+ import { KaladaV1DiagnosticCode, KaladaV1DiagnosticContextFrame, KaladaV1Outcome } from './types.cjs';
2
2
  import './json.cjs';
3
3
  import './temporal.cjs';
4
4
  import './values.cjs';
@@ -6,9 +6,10 @@ import './values.cjs';
6
6
  declare class KaladaFailure extends Error {
7
7
  readonly code: KaladaV1DiagnosticCode;
8
8
  readonly path: readonly (string | number)[];
9
- constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]);
9
+ readonly context?: readonly KaladaV1DiagnosticContextFrame[];
10
+ constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[], context?: readonly KaladaV1DiagnosticContextFrame[]);
10
11
  }
11
- declare function failure<T>(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]): KaladaV1Outcome<T>;
12
+ declare function failure<T>(code: KaladaV1DiagnosticCode, path: readonly (string | number)[], context?: readonly KaladaV1DiagnosticContextFrame[]): KaladaV1Outcome<T>;
12
13
  declare function success<T>(value: T): KaladaV1Outcome<T>;
13
14
 
14
15
  export { KaladaFailure, failure, success };
@@ -1,4 +1,4 @@
1
- import { KaladaV1DiagnosticCode, KaladaV1Outcome } from './types.js';
1
+ import { KaladaV1DiagnosticCode, KaladaV1DiagnosticContextFrame, KaladaV1Outcome } from './types.js';
2
2
  import './json.js';
3
3
  import './temporal.js';
4
4
  import './values.js';
@@ -6,9 +6,10 @@ import './values.js';
6
6
  declare class KaladaFailure extends Error {
7
7
  readonly code: KaladaV1DiagnosticCode;
8
8
  readonly path: readonly (string | number)[];
9
- constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]);
9
+ readonly context?: readonly KaladaV1DiagnosticContextFrame[];
10
+ constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[], context?: readonly KaladaV1DiagnosticContextFrame[]);
10
11
  }
11
- declare function failure<T>(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]): KaladaV1Outcome<T>;
12
+ declare function failure<T>(code: KaladaV1DiagnosticCode, path: readonly (string | number)[], context?: readonly KaladaV1DiagnosticContextFrame[]): KaladaV1Outcome<T>;
12
13
  declare function success<T>(value: T): KaladaV1Outcome<T>;
13
14
 
14
15
  export { KaladaFailure, failure, success };
@@ -17,25 +17,45 @@ const MESSAGES = Object.freeze({
17
17
  KALADA_TEMPORAL_TYPE_MISMATCH: "Kalada temporal operation received incompatible values.",
18
18
  KALADA_TEMPORAL_OVERFLOW: "Kalada temporal arithmetic exceeded safe integer milliseconds.",
19
19
  KALADA_CLOCK_ERROR: "Kalada clock sampling failed.",
20
- KALADA_INVALID_CLOCK: "Kalada clock returned an invalid Instant."
20
+ KALADA_INVALID_CLOCK: "Kalada clock returned an invalid Instant.",
21
+ KALADA_DUPLICATE_BINDING: "Kalada function contains a duplicate binding.",
22
+ KALADA_INVALID_FUNCTION_TYPE: "Kalada function type is invalid.",
23
+ KALADA_CAPTURE_LIMIT: "Kalada function captures exceed a configured limit.",
24
+ KALADA_NOT_CALLABLE: "Kalada call target is not callable.",
25
+ KALADA_FUNCTION_ARITY: "Kalada call has the wrong number of arguments.",
26
+ KALADA_FUNCTION_TYPE_MISMATCH: "Kalada function type does not match.",
27
+ KALADA_CLOSURE_LIMIT: "Kalada closure count exceeds a configured limit.",
28
+ KALADA_CALL_DEPTH_LIMIT: "Kalada call depth exceeds a configured limit.",
29
+ KALADA_CONTINUATION_LIMIT: "Kalada continuation count exceeds a configured limit.",
30
+ KALADA_COLLECTION_TYPE_MISMATCH: "Kalada collection function received an incompatible value.",
31
+ KALADA_COLLECTION_LIMIT: "Kalada collection exceeds a configured limit.",
32
+ KALADA_FUNCTION_ESCAPE: "Kalada callable cannot escape evaluation."
21
33
  });
22
34
  class KaladaFailure extends Error {
23
35
  code;
24
36
  path;
25
- constructor(code, path) {
37
+ context;
38
+ constructor(code, path, context) {
26
39
  super(code);
27
40
  this.code = code;
28
41
  this.path = path;
42
+ this.context = context;
29
43
  }
30
44
  }
31
- function failure(code, path) {
45
+ function failure(code, path, context) {
32
46
  const diagnostic = Object.freeze({
33
47
  code,
34
48
  path: Object.freeze([...path]),
35
- message: MESSAGES[code]
49
+ message: MESSAGES[code],
50
+ ...context === void 0 ? {} : { context: freezeContext(context) }
36
51
  });
37
52
  return Object.freeze({ ok: false, diagnostic });
38
53
  }
54
+ function freezeContext(context) {
55
+ return Object.freeze(
56
+ context.map((frame) => Object.freeze({ ...frame, path: Object.freeze([...frame.path]) }))
57
+ );
58
+ }
39
59
  function success(value) {
40
60
  return Object.freeze({ ok: true, value });
41
61
  }
@@ -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,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"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/diagnostics.ts"],"names":[],"mappings":"AAOA,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,2CAAA;AAAA,EACtB,wBAAA,EAA0B,+CAAA;AAAA,EAC1B,4BAAA,EAA8B,kCAAA;AAAA,EAC9B,oBAAA,EAAsB,qDAAA;AAAA,EACtB,mBAAA,EAAqB,qCAAA;AAAA,EACrB,qBAAA,EAAuB,gDAAA;AAAA,EACvB,6BAAA,EAA+B,sCAAA;AAAA,EAC/B,oBAAA,EAAsB,kDAAA;AAAA,EACtB,uBAAA,EAAyB,+CAAA;AAAA,EACzB,yBAAA,EAA2B,uDAAA;AAAA,EAC3B,+BAAA,EAAiC,4DAAA;AAAA,EACjC,uBAAA,EAAyB,+CAAA;AAAA,EACzB,sBAAA,EAAwB;AAC1B,CAAC,CAAA;AAEM,MAAM,sBAAsB,KAAA,CAAM;AAAA,EAC9B,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EAET,WAAA,CACE,IAAA,EACA,IAAA,EACA,OAAA,EACA;AACA,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF;AAEO,SAAS,OAAA,CACd,IAAA,EACA,IAAA,EACA,OAAA,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,CAAA;AAAA,IACtB,GAAI,YAAY,MAAA,GAAY,KAAK,EAAE,OAAA,EAAS,aAAA,CAAc,OAAO,CAAA;AAAE,GACpE,CAAA;AACD,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,KAAA,EAAO,YAAY,CAAA;AAChD;AAEA,SAAS,cACP,OAAA,EAC2C;AAC3C,EAAA,OAAO,MAAA,CAAO,MAAA;AAAA,IACZ,QAAQ,GAAA,CAAI,CAAC,UAAU,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,KAAA,EAAO,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,CAAC;AAAA,GAC1F;AACF;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 {\n KaladaV1Diagnostic,\n KaladaV1DiagnosticCode,\n KaladaV1DiagnosticContextFrame,\n KaladaV1Outcome,\n} 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 KALADA_DUPLICATE_BINDING: \"Kalada function contains a duplicate binding.\",\n KALADA_INVALID_FUNCTION_TYPE: \"Kalada function type is invalid.\",\n KALADA_CAPTURE_LIMIT: \"Kalada function captures exceed a configured limit.\",\n KALADA_NOT_CALLABLE: \"Kalada call target is not callable.\",\n KALADA_FUNCTION_ARITY: \"Kalada call has the wrong number of arguments.\",\n KALADA_FUNCTION_TYPE_MISMATCH: \"Kalada function type does not match.\",\n KALADA_CLOSURE_LIMIT: \"Kalada closure count exceeds a configured limit.\",\n KALADA_CALL_DEPTH_LIMIT: \"Kalada call depth exceeds a configured limit.\",\n KALADA_CONTINUATION_LIMIT: \"Kalada continuation count exceeds a configured limit.\",\n KALADA_COLLECTION_TYPE_MISMATCH: \"Kalada collection function received an incompatible value.\",\n KALADA_COLLECTION_LIMIT: \"Kalada collection exceeds a configured limit.\",\n KALADA_FUNCTION_ESCAPE: \"Kalada callable cannot escape evaluation.\",\n});\n\nexport class KaladaFailure extends Error {\n readonly code: KaladaV1DiagnosticCode;\n readonly path: readonly (string | number)[];\n readonly context?: readonly KaladaV1DiagnosticContextFrame[];\n\n constructor(\n code: KaladaV1DiagnosticCode,\n path: readonly (string | number)[],\n context?: readonly KaladaV1DiagnosticContextFrame[],\n ) {\n super(code);\n this.code = code;\n this.path = path;\n this.context = context;\n }\n}\n\nexport function failure<T>(\n code: KaladaV1DiagnosticCode,\n path: readonly (string | number)[],\n context?: readonly KaladaV1DiagnosticContextFrame[],\n): KaladaV1Outcome<T> {\n const diagnostic: KaladaV1Diagnostic = Object.freeze({\n code,\n path: Object.freeze([...path]),\n message: MESSAGES[code],\n ...(context === undefined ? {} : { context: freezeContext(context) }),\n });\n return Object.freeze({ ok: false, diagnostic });\n}\n\nfunction freezeContext(\n context: readonly KaladaV1DiagnosticContextFrame[],\n): readonly KaladaV1DiagnosticContextFrame[] {\n return Object.freeze(\n context.map((frame) => Object.freeze({ ...frame, path: Object.freeze([...frame.path]) })),\n );\n}\n\nexport function success<T>(value: T): KaladaV1Outcome<T> {\n return Object.freeze({ ok: true, value });\n}\n"]}