@kalada/core 0.1.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 (98) hide show
  1. package/README.md +25 -0
  2. package/dist/kalada-v1/canonical-input.cjs +133 -0
  3. package/dist/kalada-v1/canonical-input.cjs.map +1 -0
  4. package/dist/kalada-v1/canonical-input.d.cts +25 -0
  5. package/dist/kalada-v1/canonical-input.d.ts +25 -0
  6. package/dist/kalada-v1/canonical-input.js +122 -0
  7. package/dist/kalada-v1/canonical-input.js.map +1 -0
  8. package/dist/kalada-v1/canonicalize.cjs +214 -0
  9. package/dist/kalada-v1/canonicalize.cjs.map +1 -0
  10. package/dist/kalada-v1/canonicalize.d.cts +8 -0
  11. package/dist/kalada-v1/canonicalize.d.ts +8 -0
  12. package/dist/kalada-v1/canonicalize.js +212 -0
  13. package/dist/kalada-v1/canonicalize.js.map +1 -0
  14. package/dist/kalada-v1/codec.cjs +173 -0
  15. package/dist/kalada-v1/codec.cjs.map +1 -0
  16. package/dist/kalada-v1/codec.d.cts +32 -0
  17. package/dist/kalada-v1/codec.d.ts +32 -0
  18. package/dist/kalada-v1/codec.js +170 -0
  19. package/dist/kalada-v1/codec.js.map +1 -0
  20. package/dist/kalada-v1/compile.cjs +45 -0
  21. package/dist/kalada-v1/compile.cjs.map +1 -0
  22. package/dist/kalada-v1/compile.d.cts +8 -0
  23. package/dist/kalada-v1/compile.d.ts +8 -0
  24. package/dist/kalada-v1/compile.js +43 -0
  25. package/dist/kalada-v1/compile.js.map +1 -0
  26. package/dist/kalada-v1/dependencies.cjs +58 -0
  27. package/dist/kalada-v1/dependencies.cjs.map +1 -0
  28. package/dist/kalada-v1/dependencies.d.cts +8 -0
  29. package/dist/kalada-v1/dependencies.d.ts +8 -0
  30. package/dist/kalada-v1/dependencies.js +56 -0
  31. package/dist/kalada-v1/dependencies.js.map +1 -0
  32. package/dist/kalada-v1/diagnostics.cjs +49 -0
  33. package/dist/kalada-v1/diagnostics.cjs.map +1 -0
  34. package/dist/kalada-v1/diagnostics.d.cts +14 -0
  35. package/dist/kalada-v1/diagnostics.d.ts +14 -0
  36. package/dist/kalada-v1/diagnostics.js +45 -0
  37. package/dist/kalada-v1/diagnostics.js.map +1 -0
  38. package/dist/kalada-v1/evaluate.cjs +176 -0
  39. package/dist/kalada-v1/evaluate.cjs.map +1 -0
  40. package/dist/kalada-v1/evaluate.d.cts +8 -0
  41. package/dist/kalada-v1/evaluate.d.ts +8 -0
  42. package/dist/kalada-v1/evaluate.js +174 -0
  43. package/dist/kalada-v1/evaluate.js.map +1 -0
  44. package/dist/kalada-v1/factories.cjs +66 -0
  45. package/dist/kalada-v1/factories.cjs.map +1 -0
  46. package/dist/kalada-v1/factories.d.cts +30 -0
  47. package/dist/kalada-v1/factories.d.ts +30 -0
  48. package/dist/kalada-v1/factories.js +64 -0
  49. package/dist/kalada-v1/factories.js.map +1 -0
  50. package/dist/kalada-v1/index.cjs +88 -0
  51. package/dist/kalada-v1/index.cjs.map +1 -0
  52. package/dist/kalada-v1/index.d.cts +11 -0
  53. package/dist/kalada-v1/index.d.ts +11 -0
  54. package/dist/kalada-v1/index.js +11 -0
  55. package/dist/kalada-v1/index.js.map +1 -0
  56. package/dist/kalada-v1/json.cjs +129 -0
  57. package/dist/kalada-v1/json.cjs.map +1 -0
  58. package/dist/kalada-v1/json.d.cts +20 -0
  59. package/dist/kalada-v1/json.d.ts +20 -0
  60. package/dist/kalada-v1/json.js +123 -0
  61. package/dist/kalada-v1/json.js.map +1 -0
  62. package/dist/kalada-v1/limits.cjs +34 -0
  63. package/dist/kalada-v1/limits.cjs.map +1 -0
  64. package/dist/kalada-v1/limits.d.cts +9 -0
  65. package/dist/kalada-v1/limits.d.ts +9 -0
  66. package/dist/kalada-v1/limits.js +31 -0
  67. package/dist/kalada-v1/limits.js.map +1 -0
  68. package/dist/kalada-v1/schemas.cjs +182 -0
  69. package/dist/kalada-v1/schemas.cjs.map +1 -0
  70. package/dist/kalada-v1/schemas.d.cts +5 -0
  71. package/dist/kalada-v1/schemas.d.ts +5 -0
  72. package/dist/kalada-v1/schemas.js +179 -0
  73. package/dist/kalada-v1/schemas.js.map +1 -0
  74. package/dist/kalada-v1/temporal-evaluation.cjs +74 -0
  75. package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -0
  76. package/dist/kalada-v1/temporal-evaluation.d.cts +13 -0
  77. package/dist/kalada-v1/temporal-evaluation.d.ts +13 -0
  78. package/dist/kalada-v1/temporal-evaluation.js +71 -0
  79. package/dist/kalada-v1/temporal-evaluation.js.map +1 -0
  80. package/dist/kalada-v1/temporal.cjs +42 -0
  81. package/dist/kalada-v1/temporal.cjs.map +1 -0
  82. package/dist/kalada-v1/temporal.d.cts +22 -0
  83. package/dist/kalada-v1/temporal.d.ts +22 -0
  84. package/dist/kalada-v1/temporal.js +37 -0
  85. package/dist/kalada-v1/temporal.js.map +1 -0
  86. package/dist/kalada-v1/types.cjs +4 -0
  87. package/dist/kalada-v1/types.cjs.map +1 -0
  88. package/dist/kalada-v1/types.d.cts +120 -0
  89. package/dist/kalada-v1/types.d.ts +120 -0
  90. package/dist/kalada-v1/types.js +3 -0
  91. package/dist/kalada-v1/types.js.map +1 -0
  92. package/dist/kalada-v1/values.cjs +112 -0
  93. package/dist/kalada-v1/values.cjs.map +1 -0
  94. package/dist/kalada-v1/values.d.cts +49 -0
  95. package/dist/kalada-v1/values.d.ts +49 -0
  96. package/dist/kalada-v1/values.js +105 -0
  97. package/dist/kalada-v1/values.js.map +1 -0
  98. package/package.json +11 -1
@@ -0,0 +1,170 @@
1
+ import { cloneJsonWithStats, dataValue, cloneJson } from './json.js';
2
+ import { DEFAULT_KALADA_V1_LIMITS } from './limits.js';
3
+ import { isInstant, isDuration, Instant, Duration } from './temporal.js';
4
+ import { isOption, isResult, Option, Result } from './values.js';
5
+
6
+ const INVALID = "Invalid kalada-value v1 envelope.";
7
+ const LIMITS = Object.freeze({
8
+ maxDepth: DEFAULT_KALADA_V1_LIMITS.maxValueDepth,
9
+ maxNodes: DEFAULT_KALADA_V1_LIMITS.maxValueNodes,
10
+ maxStringLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength
11
+ });
12
+ function encodeKaladaValue(value) {
13
+ const frames = [];
14
+ const seen = /* @__PURE__ */ new WeakSet();
15
+ let current = value;
16
+ let nodes = 0;
17
+ while (isOption(current) || isResult(current)) {
18
+ nodes = charge(nodes, frames.length);
19
+ if (seen.has(current)) throw new TypeError(INVALID);
20
+ seen.add(current);
21
+ if (isOption(current) && current.variant === "none") {
22
+ return wrapFrames(frozenNone(), frames);
23
+ }
24
+ frames.push({ type: current.type, variant: current.variant });
25
+ current = current.value;
26
+ }
27
+ if (isInstant(current) || isDuration(current)) {
28
+ charge(nodes, frames.length);
29
+ return wrapFrames(frozenTemporal(current.type, current.milliseconds), frames);
30
+ }
31
+ const remaining = LIMITS.maxNodes - charge(nodes, frames.length);
32
+ const json = cloneJsonWithStats(current, {
33
+ ...LIMITS,
34
+ maxDepth: remainingDepth(frames.length),
35
+ maxNodes: remaining
36
+ });
37
+ return wrapFrames(frozenJson(json.value), frames);
38
+ }
39
+ function decodeKaladaValue(input) {
40
+ const frames = [];
41
+ const active = /* @__PURE__ */ new WeakSet();
42
+ let current = input;
43
+ let nodes = 0;
44
+ while (true) {
45
+ nodes = charge(nodes, frames.length);
46
+ const envelope = envelopeObject(current);
47
+ if (active.has(envelope)) throw new TypeError(INVALID);
48
+ active.add(envelope);
49
+ const fields = envelopeFields(envelope);
50
+ const temporal = decodeTemporal(envelope, fields);
51
+ if (temporal) return wrapValues(temporal, frames);
52
+ if (fields.type === "Json" && fields.variant === "value") {
53
+ assertKeys(envelope, ["format", "version", "type", "variant", "value"]);
54
+ const value = decodeJson(dataValue(envelope, "value"), nodes, frames.length);
55
+ return wrapValues(value, frames);
56
+ }
57
+ if (fields.type === "Option" && fields.variant === "none") {
58
+ assertKeys(envelope, ["format", "version", "type", "variant"]);
59
+ return wrapValues(Option.none(), frames);
60
+ }
61
+ frames.push(payloadFrame(fields.type, fields.variant));
62
+ assertKeys(envelope, ["format", "version", "type", "variant", "value"]);
63
+ current = dataValue(envelope, "value");
64
+ }
65
+ }
66
+ function decodeTemporal(envelope, fields) {
67
+ if (fields.type !== "Instant" && fields.type !== "Duration") return void 0;
68
+ if (fields.variant !== "milliseconds") throw new TypeError(INVALID);
69
+ assertKeys(envelope, ["format", "version", "type", "variant", "value"]);
70
+ const value = dataValue(envelope, "value");
71
+ if (typeof value !== "number" || !Number.isSafeInteger(value)) throw new TypeError(INVALID);
72
+ return fields.type === "Instant" ? Instant.fromMilliseconds(value) : Duration.fromMilliseconds(value);
73
+ }
74
+ function decodeJson(input, nodes, depth) {
75
+ return cloneJson(input, {
76
+ ...LIMITS,
77
+ maxDepth: remainingDepth(depth),
78
+ maxNodes: LIMITS.maxNodes - nodes
79
+ });
80
+ }
81
+ function envelopeObject(input) {
82
+ if (typeof input !== "object" || input === null || Array.isArray(input))
83
+ throw new TypeError(INVALID);
84
+ try {
85
+ const prototype = Object.getPrototypeOf(input);
86
+ if (prototype !== Object.prototype && prototype !== null) throw new TypeError(INVALID);
87
+ return input;
88
+ } catch {
89
+ throw new TypeError(INVALID);
90
+ }
91
+ }
92
+ function envelopeFields(input) {
93
+ try {
94
+ if (dataValue(input, "format") !== "kalada-value" || dataValue(input, "version") !== 1) {
95
+ throw new TypeError(INVALID);
96
+ }
97
+ return { type: dataValue(input, "type"), variant: dataValue(input, "variant") };
98
+ } catch {
99
+ throw new TypeError(INVALID);
100
+ }
101
+ }
102
+ function payloadFrame(type, variant) {
103
+ if (type === "Option" && variant === "some") return { type, variant };
104
+ if (type === "Result" && (variant === "ok" || variant === "err")) return { type, variant };
105
+ throw new TypeError(INVALID);
106
+ }
107
+ function assertKeys(input, expected) {
108
+ let keys;
109
+ try {
110
+ keys = Reflect.ownKeys(input);
111
+ } catch {
112
+ throw new TypeError(INVALID);
113
+ }
114
+ if (keys.length !== expected.length || !keys.every((key) => typeof key === "string" && expected.includes(key))) {
115
+ throw new TypeError(INVALID);
116
+ }
117
+ }
118
+ function wrapFrames(leaf, frames) {
119
+ let output = leaf;
120
+ for (let index = frames.length - 1; index >= 0; index -= 1) {
121
+ const frame = frames[index];
122
+ if (!frame) throw new TypeError(INVALID);
123
+ output = Object.freeze({ format: "kalada-value", version: 1, ...frame, value: output });
124
+ }
125
+ return output;
126
+ }
127
+ function wrapValues(leaf, frames) {
128
+ let output = leaf;
129
+ for (let index = frames.length - 1; index >= 0; index -= 1) {
130
+ const frame = frames[index];
131
+ if (!frame) throw new TypeError(INVALID);
132
+ output = frame.type === "Option" ? Option.some(output) : frame.variant === "ok" ? Result.ok(output) : Result.err(output);
133
+ }
134
+ return output;
135
+ }
136
+ function charge(nodes, depth) {
137
+ if (depth > LIMITS.maxDepth || nodes >= LIMITS.maxNodes)
138
+ throw new RangeError("Kalada value exceeds its limits.");
139
+ return nodes + 1;
140
+ }
141
+ function remainingDepth(depth) {
142
+ const remaining = LIMITS.maxDepth - depth;
143
+ if (remaining < 0) throw new RangeError("Kalada value exceeds its limits.");
144
+ return remaining;
145
+ }
146
+ function frozenNone() {
147
+ return Object.freeze({ format: "kalada-value", version: 1, type: "Option", variant: "none" });
148
+ }
149
+ function frozenJson(value) {
150
+ return Object.freeze({
151
+ format: "kalada-value",
152
+ version: 1,
153
+ type: "Json",
154
+ variant: "value",
155
+ value
156
+ });
157
+ }
158
+ function frozenTemporal(type, value) {
159
+ return Object.freeze({
160
+ format: "kalada-value",
161
+ version: 1,
162
+ type,
163
+ variant: "milliseconds",
164
+ value
165
+ });
166
+ }
167
+
168
+ export { decodeKaladaValue, encodeKaladaValue };
169
+ //# sourceMappingURL=codec.js.map
170
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/codec.ts"],"names":[],"mappings":"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","file":"codec.js","sourcesContent":["import { cloneJson, cloneJsonWithStats, dataValue, type JsonValue } from \"./json.js\";\nimport { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\nimport {\n Duration,\n type DurationValue,\n Instant,\n type InstantValue,\n isDuration,\n isInstant,\n} from \"./temporal.js\";\nimport { isOption, isResult, type KaladaValue, Option, Result } from \"./values.js\";\n\ninterface EncodedHeader {\n readonly format: \"kalada-value\";\n readonly version: 1;\n}\n\nexport type EncodedKaladaValueV1 =\n | (EncodedHeader & {\n readonly type: \"Json\";\n readonly variant: \"value\";\n readonly value: JsonValue;\n })\n | (EncodedHeader & { readonly type: \"Option\"; readonly variant: \"none\" })\n | (EncodedHeader & {\n readonly type: \"Option\";\n readonly variant: \"some\";\n readonly value: EncodedKaladaValueV1;\n })\n | (EncodedHeader & {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n readonly value: EncodedKaladaValueV1;\n })\n | (EncodedHeader & {\n readonly type: \"Instant\" | \"Duration\";\n readonly variant: \"milliseconds\";\n readonly value: number;\n });\n\ntype Frame =\n | { readonly type: \"Option\"; readonly variant: \"some\" }\n | {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n };\n\nconst INVALID = \"Invalid kalada-value v1 envelope.\";\nconst LIMITS = Object.freeze({\n maxDepth: DEFAULT_KALADA_V1_LIMITS.maxValueDepth,\n maxNodes: DEFAULT_KALADA_V1_LIMITS.maxValueNodes,\n maxStringLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength,\n});\n\nexport function encodeKaladaValue(value: KaladaValue): EncodedKaladaValueV1 {\n const frames: Frame[] = [];\n const seen = new WeakSet<object>();\n let current = value;\n let nodes = 0;\n while (isOption(current) || isResult(current)) {\n nodes = charge(nodes, frames.length);\n if (seen.has(current)) throw new TypeError(INVALID);\n seen.add(current);\n if (isOption(current) && current.variant === \"none\") {\n return wrapFrames(frozenNone(), frames);\n }\n frames.push({ type: current.type, variant: current.variant } as Frame);\n current = current.value;\n }\n if (isInstant(current) || isDuration(current)) {\n charge(nodes, frames.length);\n return wrapFrames(frozenTemporal(current.type, current.milliseconds), frames);\n }\n const remaining = LIMITS.maxNodes - charge(nodes, frames.length);\n const json = cloneJsonWithStats(current, {\n ...LIMITS,\n maxDepth: remainingDepth(frames.length),\n maxNodes: remaining,\n });\n return wrapFrames(frozenJson(json.value), frames);\n}\n\nexport function decodeKaladaValue(input: unknown): KaladaValue {\n const frames: Frame[] = [];\n const active = new WeakSet<object>();\n let current = input;\n let nodes = 0;\n while (true) {\n nodes = charge(nodes, frames.length);\n const envelope = envelopeObject(current);\n if (active.has(envelope)) throw new TypeError(INVALID);\n active.add(envelope);\n const fields = envelopeFields(envelope);\n const temporal = decodeTemporal(envelope, fields);\n if (temporal) return wrapValues(temporal, frames);\n if (fields.type === \"Json\" && fields.variant === \"value\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n const value = decodeJson(dataValue(envelope, \"value\"), nodes, frames.length);\n return wrapValues(value, frames);\n }\n if (fields.type === \"Option\" && fields.variant === \"none\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\"]);\n return wrapValues(Option.none(), frames);\n }\n frames.push(payloadFrame(fields.type, fields.variant));\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n current = dataValue(envelope, \"value\");\n }\n}\n\nfunction decodeTemporal(\n envelope: object,\n fields: { type: unknown; variant: unknown },\n): InstantValue | DurationValue | undefined {\n if (fields.type !== \"Instant\" && fields.type !== \"Duration\") return undefined;\n if (fields.variant !== \"milliseconds\") throw new TypeError(INVALID);\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n const value = dataValue(envelope, \"value\");\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) throw new TypeError(INVALID);\n return fields.type === \"Instant\"\n ? Instant.fromMilliseconds(value)\n : Duration.fromMilliseconds(value);\n}\n\nfunction decodeJson(input: unknown, nodes: number, depth: number): JsonValue {\n return cloneJson(input, {\n ...LIMITS,\n maxDepth: remainingDepth(depth),\n maxNodes: LIMITS.maxNodes - nodes,\n });\n}\n\nfunction envelopeObject(input: unknown): object {\n if (typeof input !== \"object\" || input === null || Array.isArray(input))\n throw new TypeError(INVALID);\n try {\n const prototype = Object.getPrototypeOf(input);\n if (prototype !== Object.prototype && prototype !== null) throw new TypeError(INVALID);\n return input;\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction envelopeFields(input: object): { type: unknown; variant: unknown } {\n try {\n if (dataValue(input, \"format\") !== \"kalada-value\" || dataValue(input, \"version\") !== 1) {\n throw new TypeError(INVALID);\n }\n return { type: dataValue(input, \"type\"), variant: dataValue(input, \"variant\") };\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction payloadFrame(type: unknown, variant: unknown): Frame {\n if (type === \"Option\" && variant === \"some\") return { type, variant };\n if (type === \"Result\" && (variant === \"ok\" || variant === \"err\")) return { type, variant };\n throw new TypeError(INVALID);\n}\n\nfunction assertKeys(input: object, expected: readonly string[]): void {\n let keys: PropertyKey[];\n try {\n keys = Reflect.ownKeys(input);\n } catch {\n throw new TypeError(INVALID);\n }\n if (\n keys.length !== expected.length ||\n !keys.every((key) => typeof key === \"string\" && expected.includes(key))\n ) {\n throw new TypeError(INVALID);\n }\n}\n\nfunction wrapFrames(leaf: EncodedKaladaValueV1, frames: readonly Frame[]): EncodedKaladaValueV1 {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output = Object.freeze({ format: \"kalada-value\", version: 1, ...frame, value: output });\n }\n return output;\n}\n\nfunction wrapValues(leaf: KaladaValue, frames: readonly Frame[]): KaladaValue {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output =\n frame.type === \"Option\"\n ? Option.some(output)\n : frame.variant === \"ok\"\n ? Result.ok(output)\n : Result.err(output);\n }\n return output;\n}\n\nfunction charge(nodes: number, depth: number): number {\n if (depth > LIMITS.maxDepth || nodes >= LIMITS.maxNodes)\n throw new RangeError(\"Kalada value exceeds its limits.\");\n return nodes + 1;\n}\n\nfunction remainingDepth(depth: number): number {\n const remaining = LIMITS.maxDepth - depth;\n if (remaining < 0) throw new RangeError(\"Kalada value exceeds its limits.\");\n return remaining;\n}\n\nfunction frozenNone(): EncodedKaladaValueV1 {\n return Object.freeze({ format: \"kalada-value\", version: 1, type: \"Option\", variant: \"none\" });\n}\n\nfunction frozenJson(value: JsonValue): EncodedKaladaValueV1 {\n return Object.freeze({\n format: \"kalada-value\",\n version: 1,\n type: \"Json\",\n variant: \"value\",\n value,\n });\n}\n\nfunction frozenTemporal(type: \"Instant\" | \"Duration\", value: number): EncodedKaladaValueV1 {\n return Object.freeze({\n format: \"kalada-value\",\n version: 1,\n type,\n variant: \"milliseconds\",\n value,\n });\n}\n"]}
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+
3
+ var callbackPromise_js = require('../kuery-v1/callback-promise.js');
4
+ var canonicalize_js = require('./canonicalize.js');
5
+ var dependencies_js = require('./dependencies.js');
6
+ var diagnostics_js = require('./diagnostics.js');
7
+ var evaluate_js = require('./evaluate.js');
8
+ var limits_js = require('./limits.js');
9
+ var temporal_js = require('./temporal.js');
10
+
11
+ function compileKaladaV1Program(input, options = {}) {
12
+ const canonical = canonicalize_js.canonicalizeKaladaV1Program(input, options);
13
+ if (!canonical.ok) return canonical;
14
+ let limits;
15
+ try {
16
+ limits = limits_js.resolveLimits(options.limits);
17
+ } catch {
18
+ return diagnostics_js.failure("KALADA_LIMIT_EXCEEDED", []);
19
+ }
20
+ const program = canonical.value;
21
+ const dependencies = dependencies_js.collectKaladaV1Dependencies(program.expression);
22
+ return diagnostics_js.success(
23
+ Object.freeze({
24
+ program,
25
+ dependencies,
26
+ evaluate: (resolve, inputs) => evaluate_js.evaluateKaladaV1(program.expression, resolve, limits, inputs),
27
+ evaluateWithClock: (resolve, clock) => evaluateWithClock(program.expression, resolve, limits, clock)
28
+ })
29
+ );
30
+ }
31
+ function evaluateWithClock(expression, resolve, limits, clock) {
32
+ let sample;
33
+ try {
34
+ sample = clock();
35
+ } catch {
36
+ return diagnostics_js.failure("KALADA_CLOCK_ERROR", ["clock"]);
37
+ }
38
+ if (callbackPromise_js.rejectCallbackPromise(sample)) return diagnostics_js.failure("KALADA_ASYNC_UNSUPPORTED", ["clock"]);
39
+ if (!temporal_js.isInstant(sample)) return diagnostics_js.failure("KALADA_INVALID_CLOCK", ["clock"]);
40
+ return evaluate_js.evaluateKaladaV1(expression, resolve, limits, { instant: sample });
41
+ }
42
+
43
+ exports.compileKaladaV1Program = compileKaladaV1Program;
44
+ //# sourceMappingURL=compile.cjs.map
45
+ //# sourceMappingURL=compile.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/compile.ts"],"names":["canonicalizeKaladaV1Program","resolveLimits","failure","collectKaladaV1Dependencies","success","evaluateKaladaV1","rejectCallbackPromise","isInstant"],"mappings":";;;;;;;;;;AAkBO,SAAS,sBAAA,CACd,KAAA,EACA,OAAA,GAA8B,EAAC,EACc;AAC7C,EAAA,MAAM,SAAA,GAAYA,2CAAA,CAA+B,KAAA,EAAO,OAAO,CAAA;AAC/D,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA;AAC1B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAASC,uBAAA,CAAc,QAAQ,MAAM,CAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAOC,sBAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA;AAAA,EAC5C;AACA,EAAA,MAAM,UAAU,SAAA,CAAU,KAAA;AAC1B,EAAA,MAAM,YAAA,GAAeC,2CAAA,CAA4B,OAAA,CAAQ,UAAU,CAAA;AACnE,EAAA,OAAOC,sBAAA;AAAA,IACL,OAAO,MAAA,CAAO;AAAA,MACZ,OAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA,EAAU,CAAC,OAAA,EAA8B,MAAA,KACvCC,6BAAiB,OAAA,CAAQ,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA;AAAA,MAC9D,iBAAA,EAAmB,CAAC,OAAA,EAA8B,KAAA,KAChD,kBAAkB,OAAA,CAAQ,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,KAAK;AAAA,KAC/D;AAAA,GACH;AACF;AAEA,SAAS,iBAAA,CACP,UAAA,EACA,OAAA,EACA,MAAA,EACA,KAAA,EACwC;AACxC,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,KAAA,EAAM;AAAA,EACjB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAOH,sBAAA,CAAQ,oBAAA,EAAsB,CAAC,OAAO,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,IAAII,wCAAA,CAAsB,MAAM,CAAA,EAAG,OAAOJ,uBAAQ,0BAAA,EAA4B,CAAC,OAAO,CAAC,CAAA;AACvF,EAAA,IAAI,CAACK,sBAAU,MAAM,CAAA,SAAUL,sBAAA,CAAQ,sBAAA,EAAwB,CAAC,OAAO,CAAC,CAAA;AACxE,EAAA,OAAOG,6BAAiB,UAAA,EAAY,OAAA,EAAS,QAAQ,EAAE,OAAA,EAAS,QAAQ,CAAA;AAC1E","file":"compile.cjs","sourcesContent":["import { rejectCallbackPromise } from \"../kuery-v1/callback-promise.js\";\nimport { canonicalizeKaladaV1Program } from \"./canonicalize.js\";\nimport { collectKaladaV1Dependencies } from \"./dependencies.js\";\nimport { failure, success } from \"./diagnostics.js\";\nimport { evaluateKaladaV1 } from \"./evaluate.js\";\nimport type { JsonValue } from \"./json.js\";\nimport { resolveLimits } from \"./limits.js\";\nimport { isInstant } from \"./temporal.js\";\nimport type {\n CompiledKaladaV1Program,\n KaladaV1Clock,\n KaladaV1EvaluationInputs,\n KaladaV1Limits,\n KaladaV1Options,\n KaladaV1Outcome,\n KaladaV1Resolver,\n} from \"./types.js\";\n\nexport function compileKaladaV1Program<R extends JsonValue = string>(\n input: unknown,\n options: KaladaV1Options<R> = {},\n): KaladaV1Outcome<CompiledKaladaV1Program<R>> {\n const canonical = canonicalizeKaladaV1Program<R>(input, options);\n if (!canonical.ok) return canonical;\n let limits: KaladaV1Limits;\n try {\n limits = resolveLimits(options.limits);\n } catch {\n return failure(\"KALADA_LIMIT_EXCEEDED\", []);\n }\n const program = canonical.value;\n const dependencies = collectKaladaV1Dependencies(program.expression);\n return success(\n Object.freeze({\n program,\n dependencies,\n evaluate: (resolve: KaladaV1Resolver<R>, inputs?: KaladaV1EvaluationInputs) =>\n evaluateKaladaV1(program.expression, resolve, limits, inputs),\n evaluateWithClock: (resolve: KaladaV1Resolver<R>, clock: KaladaV1Clock) =>\n evaluateWithClock(program.expression, resolve, limits, clock),\n }),\n );\n}\n\nfunction evaluateWithClock<R extends JsonValue>(\n expression: Parameters<typeof evaluateKaladaV1<R>>[0],\n resolve: KaladaV1Resolver<R>,\n limits: KaladaV1Limits,\n clock: KaladaV1Clock,\n): ReturnType<typeof evaluateKaladaV1<R>> {\n let sample: unknown;\n try {\n sample = clock();\n } catch {\n return failure(\"KALADA_CLOCK_ERROR\", [\"clock\"]);\n }\n if (rejectCallbackPromise(sample)) return failure(\"KALADA_ASYNC_UNSUPPORTED\", [\"clock\"]);\n if (!isInstant(sample)) return failure(\"KALADA_INVALID_CLOCK\", [\"clock\"]);\n return evaluateKaladaV1(expression, resolve, limits, { instant: sample });\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { JsonValue } from './json.cjs';
2
+ import { KaladaV1Options, KaladaV1Outcome, CompiledKaladaV1Program } from './types.cjs';
3
+ import './temporal.cjs';
4
+ import './values.cjs';
5
+
6
+ declare function compileKaladaV1Program<R extends JsonValue = string>(input: unknown, options?: KaladaV1Options<R>): KaladaV1Outcome<CompiledKaladaV1Program<R>>;
7
+
8
+ export { compileKaladaV1Program };
@@ -0,0 +1,8 @@
1
+ import { JsonValue } from './json.js';
2
+ import { KaladaV1Options, KaladaV1Outcome, CompiledKaladaV1Program } from './types.js';
3
+ import './temporal.js';
4
+ import './values.js';
5
+
6
+ declare function compileKaladaV1Program<R extends JsonValue = string>(input: unknown, options?: KaladaV1Options<R>): KaladaV1Outcome<CompiledKaladaV1Program<R>>;
7
+
8
+ export { compileKaladaV1Program };
@@ -0,0 +1,43 @@
1
+ import { rejectCallbackPromise } from '../kuery-v1/callback-promise.js';
2
+ import { canonicalizeKaladaV1Program } from './canonicalize.js';
3
+ import { collectKaladaV1Dependencies } from './dependencies.js';
4
+ import { failure, success } from './diagnostics.js';
5
+ import { evaluateKaladaV1 } from './evaluate.js';
6
+ import { resolveLimits } from './limits.js';
7
+ import { isInstant } from './temporal.js';
8
+
9
+ function compileKaladaV1Program(input, options = {}) {
10
+ const canonical = canonicalizeKaladaV1Program(input, options);
11
+ if (!canonical.ok) return canonical;
12
+ let limits;
13
+ try {
14
+ limits = resolveLimits(options.limits);
15
+ } catch {
16
+ return failure("KALADA_LIMIT_EXCEEDED", []);
17
+ }
18
+ const program = canonical.value;
19
+ const dependencies = collectKaladaV1Dependencies(program.expression);
20
+ return success(
21
+ Object.freeze({
22
+ program,
23
+ dependencies,
24
+ evaluate: (resolve, inputs) => evaluateKaladaV1(program.expression, resolve, limits, inputs),
25
+ evaluateWithClock: (resolve, clock) => evaluateWithClock(program.expression, resolve, limits, clock)
26
+ })
27
+ );
28
+ }
29
+ function evaluateWithClock(expression, resolve, limits, clock) {
30
+ let sample;
31
+ try {
32
+ sample = clock();
33
+ } catch {
34
+ return failure("KALADA_CLOCK_ERROR", ["clock"]);
35
+ }
36
+ if (rejectCallbackPromise(sample)) return failure("KALADA_ASYNC_UNSUPPORTED", ["clock"]);
37
+ if (!isInstant(sample)) return failure("KALADA_INVALID_CLOCK", ["clock"]);
38
+ return evaluateKaladaV1(expression, resolve, limits, { instant: sample });
39
+ }
40
+
41
+ export { compileKaladaV1Program };
42
+ //# sourceMappingURL=compile.js.map
43
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,58 @@
1
+ 'use strict';
2
+
3
+ var json_js = require('./json.js');
4
+
5
+ function collectKaladaV1Dependencies(expression) {
6
+ const output = [];
7
+ const identities = /* @__PURE__ */ new Set();
8
+ visit(expression, /* @__PURE__ */ new Set(), output, identities);
9
+ return Object.freeze(output);
10
+ }
11
+ function visit(node, scope, output, identities) {
12
+ if (node.kind === "ref") {
13
+ addReference(node.ref, scope, output, identities);
14
+ return;
15
+ }
16
+ if (node.kind === "literal" || node.kind === "instant" || node.kind === "duration" || node.kind === "current-instant" || node.kind === "option" && node.variant === "none")
17
+ return;
18
+ if (node.kind === "binding") {
19
+ visitBinding(node, scope, output, identities);
20
+ return;
21
+ }
22
+ if (node.kind === "match") {
23
+ visitMatch(node.value, node.arms, scope, output, identities);
24
+ return;
25
+ }
26
+ if (node.kind === "temporal-arithmetic" || node.kind === "temporal-comparison") {
27
+ visit(node.left, scope, output, identities);
28
+ visit(node.right, scope, output, identities);
29
+ return;
30
+ }
31
+ visit(node.value, scope, output, identities);
32
+ }
33
+ function visitBinding(node, scope, output, identities) {
34
+ visit(node.value, scope, output, identities);
35
+ visit(node.body, extended(scope, node.name), output, identities);
36
+ }
37
+ function visitMatch(value, arms, scope, output, identities) {
38
+ visit(value, scope, output, identities);
39
+ for (const arm of arms) {
40
+ visit(arm.body, arm.binding ? extended(scope, arm.binding) : scope, output, identities);
41
+ }
42
+ }
43
+ function addReference(reference, scope, output, identities) {
44
+ if (typeof reference === "string" && scope.has(reference)) return;
45
+ const identity = json_js.canonicalJsonIdentity(reference);
46
+ if (identities.has(identity)) return;
47
+ identities.add(identity);
48
+ output.push(reference);
49
+ }
50
+ function extended(scope, name) {
51
+ const output = new Set(scope);
52
+ output.add(name);
53
+ return output;
54
+ }
55
+
56
+ exports.collectKaladaV1Dependencies = collectKaladaV1Dependencies;
57
+ //# sourceMappingURL=dependencies.cjs.map
58
+ //# sourceMappingURL=dependencies.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/dependencies.ts"],"names":["canonicalJsonIdentity"],"mappings":"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","file":"dependencies.cjs","sourcesContent":["import { canonicalJsonIdentity, type JsonValue } from \"./json.js\";\nimport type { KaladaV1Expression, MatchArm } from \"./types.js\";\n\nexport function collectKaladaV1Dependencies<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n): readonly R[] {\n const output: R[] = [];\n const identities = new Set<string>();\n visit(expression, new Set(), output, identities);\n return Object.freeze(output);\n}\n\nfunction visit<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (node.kind === \"ref\") {\n addReference(node.ref, scope, output, identities);\n return;\n }\n if (\n node.kind === \"literal\" ||\n node.kind === \"instant\" ||\n node.kind === \"duration\" ||\n node.kind === \"current-instant\" ||\n (node.kind === \"option\" && node.variant === \"none\")\n )\n return;\n if (node.kind === \"binding\") {\n visitBinding(node, scope, output, identities);\n return;\n }\n if (node.kind === \"match\") {\n visitMatch(node.value, node.arms, scope, output, identities);\n return;\n }\n if (node.kind === \"temporal-arithmetic\" || node.kind === \"temporal-comparison\") {\n visit(node.left, scope, output, identities);\n visit(node.right, scope, output, identities);\n return;\n }\n visit(node.value, scope, output, identities);\n}\n\nfunction visitBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(node.value, scope, output, identities);\n visit(node.body, extended(scope, node.name), output, identities);\n}\n\nfunction visitMatch<R extends JsonValue>(\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(value, scope, output, identities);\n for (const arm of arms) {\n visit(arm.body, arm.binding ? extended(scope, arm.binding) : scope, output, identities);\n }\n}\n\nfunction addReference<R extends JsonValue>(\n reference: R,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (typeof reference === \"string\" && scope.has(reference)) return;\n const identity = canonicalJsonIdentity(reference);\n if (identities.has(identity)) return;\n identities.add(identity);\n output.push(reference);\n}\n\nfunction extended(scope: ReadonlySet<string>, name: string): ReadonlySet<string> {\n const output = new Set(scope);\n output.add(name);\n return output;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { JsonValue } from './json.cjs';
2
+ import { KaladaV1Expression } from './types.cjs';
3
+ import './temporal.cjs';
4
+ import './values.cjs';
5
+
6
+ declare function collectKaladaV1Dependencies<R extends JsonValue>(expression: KaladaV1Expression<R>): readonly R[];
7
+
8
+ export { collectKaladaV1Dependencies };
@@ -0,0 +1,8 @@
1
+ import { JsonValue } from './json.js';
2
+ import { KaladaV1Expression } from './types.js';
3
+ import './temporal.js';
4
+ import './values.js';
5
+
6
+ declare function collectKaladaV1Dependencies<R extends JsonValue>(expression: KaladaV1Expression<R>): readonly R[];
7
+
8
+ export { collectKaladaV1Dependencies };
@@ -0,0 +1,56 @@
1
+ import { canonicalJsonIdentity } from './json.js';
2
+
3
+ function collectKaladaV1Dependencies(expression) {
4
+ const output = [];
5
+ const identities = /* @__PURE__ */ new Set();
6
+ visit(expression, /* @__PURE__ */ new Set(), output, identities);
7
+ return Object.freeze(output);
8
+ }
9
+ function visit(node, scope, output, identities) {
10
+ if (node.kind === "ref") {
11
+ addReference(node.ref, scope, output, identities);
12
+ return;
13
+ }
14
+ if (node.kind === "literal" || node.kind === "instant" || node.kind === "duration" || node.kind === "current-instant" || node.kind === "option" && node.variant === "none")
15
+ return;
16
+ if (node.kind === "binding") {
17
+ visitBinding(node, scope, output, identities);
18
+ return;
19
+ }
20
+ if (node.kind === "match") {
21
+ visitMatch(node.value, node.arms, scope, output, identities);
22
+ return;
23
+ }
24
+ if (node.kind === "temporal-arithmetic" || node.kind === "temporal-comparison") {
25
+ visit(node.left, scope, output, identities);
26
+ visit(node.right, scope, output, identities);
27
+ return;
28
+ }
29
+ visit(node.value, scope, output, identities);
30
+ }
31
+ function visitBinding(node, scope, output, identities) {
32
+ visit(node.value, scope, output, identities);
33
+ visit(node.body, extended(scope, node.name), output, identities);
34
+ }
35
+ function visitMatch(value, arms, scope, output, identities) {
36
+ visit(value, scope, output, identities);
37
+ for (const arm of arms) {
38
+ visit(arm.body, arm.binding ? extended(scope, arm.binding) : scope, output, identities);
39
+ }
40
+ }
41
+ function addReference(reference, scope, output, identities) {
42
+ if (typeof reference === "string" && scope.has(reference)) return;
43
+ const identity = canonicalJsonIdentity(reference);
44
+ if (identities.has(identity)) return;
45
+ identities.add(identity);
46
+ output.push(reference);
47
+ }
48
+ function extended(scope, name) {
49
+ const output = new Set(scope);
50
+ output.add(name);
51
+ return output;
52
+ }
53
+
54
+ export { collectKaladaV1Dependencies };
55
+ //# sourceMappingURL=dependencies.js.map
56
+ //# sourceMappingURL=dependencies.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,49 @@
1
+ 'use strict';
2
+
3
+ const MESSAGES = Object.freeze({
4
+ KALADA_INVALID_INPUT: "Kalada program input is invalid.",
5
+ KALADA_LIMIT_EXCEEDED: "Kalada program input exceeds a configured limit.",
6
+ KALADA_INVALID_REFERENCE: "Kalada reference is invalid.",
7
+ KALADA_MATCH_MISSING_ARM: "Kalada match is missing a required arm.",
8
+ KALADA_MATCH_DUPLICATE_ARM: "Kalada match contains a duplicate arm.",
9
+ KALADA_MATCH_UNKNOWN_ARM: "Kalada match contains an unknown arm.",
10
+ KALADA_MATCH_UNREACHABLE_ARM: "Kalada match contains an unreachable arm.",
11
+ KALADA_MATCH_TYPE_MISMATCH: "Kalada match received the wrong value type.",
12
+ KALADA_REFERENCE_ERROR: "Kalada reference resolution failed.",
13
+ KALADA_REFERENCE_MISSING: "Kalada reference is missing.",
14
+ KALADA_REFERENCE_DENIED: "Kalada reference access was denied.",
15
+ KALADA_ASYNC_UNSUPPORTED: "Kalada callbacks must return synchronously.",
16
+ KALADA_INVALID_RESULT: "Kalada reference callback returned an invalid value.",
17
+ KALADA_EVALUATION_LIMIT: "Kalada evaluation exceeded its configured step limit.",
18
+ KALADA_INSTANT_REQUIRED: "Kalada evaluation requires an explicit current Instant.",
19
+ KALADA_TEMPORAL_TYPE_MISMATCH: "Kalada temporal operation received incompatible values.",
20
+ KALADA_TEMPORAL_OVERFLOW: "Kalada temporal arithmetic exceeded safe integer milliseconds.",
21
+ KALADA_CLOCK_ERROR: "Kalada clock sampling failed.",
22
+ KALADA_INVALID_CLOCK: "Kalada clock returned an invalid Instant."
23
+ });
24
+ class KaladaFailure extends Error {
25
+ code;
26
+ path;
27
+ constructor(code, path) {
28
+ super(code);
29
+ this.code = code;
30
+ this.path = path;
31
+ }
32
+ }
33
+ function failure(code, path) {
34
+ const diagnostic = Object.freeze({
35
+ code,
36
+ path: Object.freeze([...path]),
37
+ message: MESSAGES[code]
38
+ });
39
+ return Object.freeze({ ok: false, diagnostic });
40
+ }
41
+ function success(value) {
42
+ return Object.freeze({ ok: true, value });
43
+ }
44
+
45
+ exports.KaladaFailure = KaladaFailure;
46
+ exports.failure = failure;
47
+ exports.success = success;
48
+ //# sourceMappingURL=diagnostics.cjs.map
49
+ //# sourceMappingURL=diagnostics.cjs.map
@@ -0,0 +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"]}
@@ -0,0 +1,14 @@
1
+ import { KaladaV1DiagnosticCode, KaladaV1Outcome } from './types.cjs';
2
+ import './json.cjs';
3
+ import './temporal.cjs';
4
+ import './values.cjs';
5
+
6
+ declare class KaladaFailure extends Error {
7
+ readonly code: KaladaV1DiagnosticCode;
8
+ readonly path: readonly (string | number)[];
9
+ constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]);
10
+ }
11
+ declare function failure<T>(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]): KaladaV1Outcome<T>;
12
+ declare function success<T>(value: T): KaladaV1Outcome<T>;
13
+
14
+ export { KaladaFailure, failure, success };
@@ -0,0 +1,14 @@
1
+ import { KaladaV1DiagnosticCode, KaladaV1Outcome } from './types.js';
2
+ import './json.js';
3
+ import './temporal.js';
4
+ import './values.js';
5
+
6
+ declare class KaladaFailure extends Error {
7
+ readonly code: KaladaV1DiagnosticCode;
8
+ readonly path: readonly (string | number)[];
9
+ constructor(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]);
10
+ }
11
+ declare function failure<T>(code: KaladaV1DiagnosticCode, path: readonly (string | number)[]): KaladaV1Outcome<T>;
12
+ declare function success<T>(value: T): KaladaV1Outcome<T>;
13
+
14
+ export { KaladaFailure, failure, success };
@@ -0,0 +1,45 @@
1
+ const MESSAGES = Object.freeze({
2
+ KALADA_INVALID_INPUT: "Kalada program input is invalid.",
3
+ KALADA_LIMIT_EXCEEDED: "Kalada program input exceeds a configured limit.",
4
+ KALADA_INVALID_REFERENCE: "Kalada reference is invalid.",
5
+ KALADA_MATCH_MISSING_ARM: "Kalada match is missing a required arm.",
6
+ KALADA_MATCH_DUPLICATE_ARM: "Kalada match contains a duplicate arm.",
7
+ KALADA_MATCH_UNKNOWN_ARM: "Kalada match contains an unknown arm.",
8
+ KALADA_MATCH_UNREACHABLE_ARM: "Kalada match contains an unreachable arm.",
9
+ KALADA_MATCH_TYPE_MISMATCH: "Kalada match received the wrong value type.",
10
+ KALADA_REFERENCE_ERROR: "Kalada reference resolution failed.",
11
+ KALADA_REFERENCE_MISSING: "Kalada reference is missing.",
12
+ KALADA_REFERENCE_DENIED: "Kalada reference access was denied.",
13
+ KALADA_ASYNC_UNSUPPORTED: "Kalada callbacks must return synchronously.",
14
+ KALADA_INVALID_RESULT: "Kalada reference callback returned an invalid value.",
15
+ KALADA_EVALUATION_LIMIT: "Kalada evaluation exceeded its configured step limit.",
16
+ KALADA_INSTANT_REQUIRED: "Kalada evaluation requires an explicit current Instant.",
17
+ KALADA_TEMPORAL_TYPE_MISMATCH: "Kalada temporal operation received incompatible values.",
18
+ KALADA_TEMPORAL_OVERFLOW: "Kalada temporal arithmetic exceeded safe integer milliseconds.",
19
+ KALADA_CLOCK_ERROR: "Kalada clock sampling failed.",
20
+ KALADA_INVALID_CLOCK: "Kalada clock returned an invalid Instant."
21
+ });
22
+ class KaladaFailure extends Error {
23
+ code;
24
+ path;
25
+ constructor(code, path) {
26
+ super(code);
27
+ this.code = code;
28
+ this.path = path;
29
+ }
30
+ }
31
+ function failure(code, path) {
32
+ const diagnostic = Object.freeze({
33
+ code,
34
+ path: Object.freeze([...path]),
35
+ message: MESSAGES[code]
36
+ });
37
+ return Object.freeze({ ok: false, diagnostic });
38
+ }
39
+ function success(value) {
40
+ return Object.freeze({ ok: true, value });
41
+ }
42
+
43
+ export { KaladaFailure, failure, success };
44
+ //# sourceMappingURL=diagnostics.js.map
45
+ //# sourceMappingURL=diagnostics.js.map