@kalada/core 0.2.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 (140) hide show
  1. package/README.md +62 -3
  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 +26 -0
  5. package/dist/kalada-v1/canonical-input.d.ts +26 -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 +93 -130
  9. package/dist/kalada-v1/canonicalize.cjs.map +1 -1
  10. package/dist/kalada-v1/canonicalize.d.cts +1 -0
  11. package/dist/kalada-v1/canonicalize.d.ts +1 -0
  12. package/dist/kalada-v1/canonicalize.js +71 -108
  13. package/dist/kalada-v1/canonicalize.js.map +1 -1
  14. package/dist/kalada-v1/codec.cjs +24 -0
  15. package/dist/kalada-v1/codec.cjs.map +1 -1
  16. package/dist/kalada-v1/codec.d.cts +5 -0
  17. package/dist/kalada-v1/codec.d.ts +5 -0
  18. package/dist/kalada-v1/codec.js +24 -0
  19. package/dist/kalada-v1/codec.js.map +1 -1
  20. package/dist/kalada-v1/compile.cjs +24 -1
  21. package/dist/kalada-v1/compile.cjs.map +1 -1
  22. package/dist/kalada-v1/compile.d.cts +1 -0
  23. package/dist/kalada-v1/compile.d.ts +1 -0
  24. package/dist/kalada-v1/compile.js +25 -2
  25. package/dist/kalada-v1/compile.js.map +1 -1
  26. package/dist/kalada-v1/dependencies.cjs +55 -2
  27. package/dist/kalada-v1/dependencies.cjs.map +1 -1
  28. package/dist/kalada-v1/dependencies.d.cts +1 -0
  29. package/dist/kalada-v1/dependencies.d.ts +1 -0
  30. package/dist/kalada-v1/dependencies.js +55 -2
  31. package/dist/kalada-v1/dependencies.js.map +1 -1
  32. package/dist/kalada-v1/diagnostics.cjs +29 -4
  33. package/dist/kalada-v1/diagnostics.cjs.map +1 -1
  34. package/dist/kalada-v1/diagnostics.d.cts +5 -3
  35. package/dist/kalada-v1/diagnostics.d.ts +5 -3
  36. package/dist/kalada-v1/diagnostics.js +29 -4
  37. package/dist/kalada-v1/diagnostics.js.map +1 -1
  38. package/dist/kalada-v1/evaluate.cjs +23 -117
  39. package/dist/kalada-v1/evaluate.cjs.map +1 -1
  40. package/dist/kalada-v1/evaluate.d.cts +4 -2
  41. package/dist/kalada-v1/evaluate.d.ts +4 -2
  42. package/dist/kalada-v1/evaluate.js +24 -118
  43. package/dist/kalada-v1/evaluate.js.map +1 -1
  44. package/dist/kalada-v1/evaluation-delivery.cjs +286 -0
  45. package/dist/kalada-v1/evaluation-delivery.cjs.map +1 -0
  46. package/dist/kalada-v1/evaluation-delivery.d.cts +13 -0
  47. package/dist/kalada-v1/evaluation-delivery.d.ts +13 -0
  48. package/dist/kalada-v1/evaluation-delivery.js +284 -0
  49. package/dist/kalada-v1/evaluation-delivery.js.map +1 -0
  50. package/dist/kalada-v1/evaluation-frames.cjs +16 -0
  51. package/dist/kalada-v1/evaluation-frames.cjs.map +1 -0
  52. package/dist/kalada-v1/evaluation-frames.d.cts +83 -0
  53. package/dist/kalada-v1/evaluation-frames.d.ts +83 -0
  54. package/dist/kalada-v1/evaluation-frames.js +14 -0
  55. package/dist/kalada-v1/evaluation-frames.js.map +1 -0
  56. package/dist/kalada-v1/evaluation-machine.cjs +226 -0
  57. package/dist/kalada-v1/evaluation-machine.cjs.map +1 -0
  58. package/dist/kalada-v1/evaluation-machine.d.cts +9 -0
  59. package/dist/kalada-v1/evaluation-machine.d.ts +9 -0
  60. package/dist/kalada-v1/evaluation-machine.js +224 -0
  61. package/dist/kalada-v1/evaluation-machine.js.map +1 -0
  62. package/dist/kalada-v1/evaluation-resolution.cjs +80 -0
  63. package/dist/kalada-v1/evaluation-resolution.cjs.map +1 -0
  64. package/dist/kalada-v1/evaluation-resolution.d.cts +11 -0
  65. package/dist/kalada-v1/evaluation-resolution.d.ts +11 -0
  66. package/dist/kalada-v1/evaluation-resolution.js +78 -0
  67. package/dist/kalada-v1/evaluation-resolution.js.map +1 -0
  68. package/dist/kalada-v1/evaluation-state.cjs +94 -0
  69. package/dist/kalada-v1/evaluation-state.cjs.map +1 -0
  70. package/dist/kalada-v1/evaluation-state.d.cts +38 -0
  71. package/dist/kalada-v1/evaluation-state.d.ts +38 -0
  72. package/dist/kalada-v1/evaluation-state.js +81 -0
  73. package/dist/kalada-v1/evaluation-state.js.map +1 -0
  74. package/dist/kalada-v1/factories.cjs +46 -0
  75. package/dist/kalada-v1/factories.cjs.map +1 -1
  76. package/dist/kalada-v1/factories.d.cts +24 -1
  77. package/dist/kalada-v1/factories.d.ts +24 -1
  78. package/dist/kalada-v1/factories.js +46 -0
  79. package/dist/kalada-v1/factories.js.map +1 -1
  80. package/dist/kalada-v1/function-contracts.cjs +150 -0
  81. package/dist/kalada-v1/function-contracts.cjs.map +1 -0
  82. package/dist/kalada-v1/function-contracts.d.cts +15 -0
  83. package/dist/kalada-v1/function-contracts.d.ts +15 -0
  84. package/dist/kalada-v1/function-contracts.js +144 -0
  85. package/dist/kalada-v1/function-contracts.js.map +1 -0
  86. package/dist/kalada-v1/index.cjs +30 -0
  87. package/dist/kalada-v1/index.d.cts +5 -3
  88. package/dist/kalada-v1/index.d.ts +5 -3
  89. package/dist/kalada-v1/index.js +4 -2
  90. package/dist/kalada-v1/limits.cjs +23 -2
  91. package/dist/kalada-v1/limits.cjs.map +1 -1
  92. package/dist/kalada-v1/limits.d.cts +6 -3
  93. package/dist/kalada-v1/limits.d.ts +6 -3
  94. package/dist/kalada-v1/limits.js +23 -3
  95. package/dist/kalada-v1/limits.js.map +1 -1
  96. package/dist/kalada-v1/runtime-values.cjs +112 -0
  97. package/dist/kalada-v1/runtime-values.cjs.map +1 -0
  98. package/dist/kalada-v1/runtime-values.d.cts +35 -0
  99. package/dist/kalada-v1/runtime-values.d.ts +35 -0
  100. package/dist/kalada-v1/runtime-values.js +105 -0
  101. package/dist/kalada-v1/runtime-values.js.map +1 -0
  102. package/dist/kalada-v1/schemas.cjs +136 -3
  103. package/dist/kalada-v1/schemas.cjs.map +1 -1
  104. package/dist/kalada-v1/schemas.d.cts +2 -1
  105. package/dist/kalada-v1/schemas.d.ts +2 -1
  106. package/dist/kalada-v1/schemas.js +137 -5
  107. package/dist/kalada-v1/schemas.js.map +1 -1
  108. package/dist/kalada-v1/static-analysis.cjs +177 -0
  109. package/dist/kalada-v1/static-analysis.cjs.map +1 -0
  110. package/dist/kalada-v1/static-analysis.d.cts +9 -0
  111. package/dist/kalada-v1/static-analysis.d.ts +9 -0
  112. package/dist/kalada-v1/static-analysis.js +175 -0
  113. package/dist/kalada-v1/static-analysis.js.map +1 -0
  114. package/dist/kalada-v1/static-types.cjs +229 -0
  115. package/dist/kalada-v1/static-types.cjs.map +1 -0
  116. package/dist/kalada-v1/static-types.d.cts +8 -0
  117. package/dist/kalada-v1/static-types.d.ts +8 -0
  118. package/dist/kalada-v1/static-types.js +227 -0
  119. package/dist/kalada-v1/static-types.js.map +1 -0
  120. package/dist/kalada-v1/temporal-evaluation.cjs +95 -0
  121. package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -0
  122. package/dist/kalada-v1/temporal-evaluation.d.cts +18 -0
  123. package/dist/kalada-v1/temporal-evaluation.d.ts +18 -0
  124. package/dist/kalada-v1/temporal-evaluation.js +90 -0
  125. package/dist/kalada-v1/temporal-evaluation.js.map +1 -0
  126. package/dist/kalada-v1/temporal.cjs +42 -0
  127. package/dist/kalada-v1/temporal.cjs.map +1 -0
  128. package/dist/kalada-v1/temporal.d.cts +22 -0
  129. package/dist/kalada-v1/temporal.d.ts +22 -0
  130. package/dist/kalada-v1/temporal.js +37 -0
  131. package/dist/kalada-v1/temporal.js.map +1 -0
  132. package/dist/kalada-v1/types.d.cts +108 -5
  133. package/dist/kalada-v1/types.d.ts +108 -5
  134. package/dist/kalada-v1/values.cjs +13 -1
  135. package/dist/kalada-v1/values.cjs.map +1 -1
  136. package/dist/kalada-v1/values.d.cts +2 -1
  137. package/dist/kalada-v1/values.d.ts +2 -1
  138. package/dist/kalada-v1/values.js +13 -1
  139. package/dist/kalada-v1/values.js.map +1 -1
  140. package/package.json +1 -1
@@ -1,8 +1,27 @@
1
+ import { properties, count, exact, safeJson, inspectJson, safeValidate, safeCanonicalize, referenceLength, bindingName, strictArray } from './canonical-input.js';
1
2
  import { KaladaFailure, success, failure } from './diagnostics.js';
2
- import { dataValue, cloneJsonWithStats, cloneJson, canonicalJsonIdentity } from './json.js';
3
+ import { canonicalFunction, canonicalCall, canonicalGroup, canonicalCoreFunction } from './function-contracts.js';
3
4
  import { resolveLimits } from './limits.js';
4
5
 
5
- const NODE_KEYS = /* @__PURE__ */ new Set(["kind", "value", "ref", "name", "body", "variant", "type", "arms"]);
6
+ const NODE_KEYS = /* @__PURE__ */ new Set([
7
+ "kind",
8
+ "value",
9
+ "ref",
10
+ "name",
11
+ "body",
12
+ "variant",
13
+ "type",
14
+ "arms",
15
+ "milliseconds",
16
+ "operator",
17
+ "left",
18
+ "right",
19
+ "parameters",
20
+ "returns",
21
+ "callee",
22
+ "arguments",
23
+ "functions"
24
+ ]);
6
25
  const ARM_ORDER = Object.freeze({ Option: ["some", "none"], Result: ["ok", "err"] });
7
26
  function canonicalizeKaladaV1Program(input, options = {}) {
8
27
  try {
@@ -37,15 +56,65 @@ function canonicalNode(input, path, depth, state) {
37
56
  const raw = properties(input, path, NODE_KEYS, false);
38
57
  if (raw.kind === "literal") return canonicalLiteral(raw, path, state);
39
58
  if (raw.kind === "ref") return canonicalReference(raw, path, state);
59
+ const added = canonicalAddedNode(raw, path, depth, state);
60
+ if (added) return added;
40
61
  if (raw.kind === "binding") return canonicalBinding(raw, path, depth, state);
41
62
  if (raw.kind === "option") return canonicalOption(raw, path, depth, state);
42
63
  if (raw.kind === "result") return canonicalResult(raw, path, depth, state);
43
64
  if (raw.kind === "match") return canonicalMatch(raw, path, depth, state);
65
+ if (raw.kind === "instant" || raw.kind === "duration") return canonicalTemporal(raw, path);
66
+ if (raw.kind === "current-instant") return canonicalCurrentInstant(raw, path);
67
+ if (raw.kind === "temporal-arithmetic") {
68
+ return canonicalTemporalOperation(raw, path, depth, state, ["add", "subtract"]);
69
+ }
70
+ if (raw.kind === "temporal-comparison") {
71
+ return canonicalTemporalOperation(raw, path, depth, state, [
72
+ "equal",
73
+ "not-equal",
74
+ "less-than",
75
+ "less-than-or-equal",
76
+ "greater-than",
77
+ "greater-than-or-equal"
78
+ ]);
79
+ }
44
80
  throw new KaladaFailure("KALADA_INVALID_INPUT", [...path, "kind"]);
45
81
  } finally {
46
82
  state.active.delete(input);
47
83
  }
48
84
  }
85
+ function canonicalAddedNode(raw, path, depth, state) {
86
+ if (raw.kind === "function") return canonicalFunction(raw, path, depth, state, canonicalNode);
87
+ if (raw.kind === "call") return canonicalCall(raw, path, depth, state, canonicalNode);
88
+ if (raw.kind === "function-group") return canonicalGroup(raw, path, depth, state, canonicalNode);
89
+ if (raw.kind === "core-function") return canonicalCoreFunction(raw, path);
90
+ return void 0;
91
+ }
92
+ function canonicalTemporal(raw, path) {
93
+ exact(raw, path, ["kind", "milliseconds"]);
94
+ if (!Number.isSafeInteger(raw.milliseconds)) {
95
+ throw new KaladaFailure("KALADA_INVALID_INPUT", [...path, "milliseconds"]);
96
+ }
97
+ return Object.freeze({
98
+ kind: raw.kind,
99
+ milliseconds: Object.is(raw.milliseconds, -0) ? 0 : raw.milliseconds
100
+ });
101
+ }
102
+ function canonicalCurrentInstant(raw, path) {
103
+ exact(raw, path, ["kind"]);
104
+ return Object.freeze({ kind: "current-instant" });
105
+ }
106
+ function canonicalTemporalOperation(raw, path, depth, state, operators) {
107
+ exact(raw, path, ["kind", "operator", "left", "right"]);
108
+ if (typeof raw.operator !== "string" || !operators.includes(raw.operator)) {
109
+ throw new KaladaFailure("KALADA_INVALID_INPUT", [...path, "operator"]);
110
+ }
111
+ return Object.freeze({
112
+ kind: raw.kind,
113
+ operator: raw.operator,
114
+ left: canonicalNode(raw.left, [...path, "left"], depth + 1, state),
115
+ right: canonicalNode(raw.right, [...path, "right"], depth + 1, state)
116
+ });
117
+ }
49
118
  function canonicalLiteral(raw, path, state) {
50
119
  exact(raw, path, ["kind", "value"]);
51
120
  return Object.freeze({
@@ -152,112 +221,6 @@ function requiredArm(found, variant, path) {
152
221
  if (!arm) throw new KaladaFailure("KALADA_MATCH_MISSING_ARM", [...path, "arms"]);
153
222
  return arm;
154
223
  }
155
- function properties(input, path, allowed, requireExact = true) {
156
- if (typeof input !== "object" || input === null || Array.isArray(input))
157
- throw new KaladaFailure("KALADA_INVALID_INPUT", path);
158
- let keys;
159
- try {
160
- keys = Reflect.ownKeys(input);
161
- } catch {
162
- throw new KaladaFailure("KALADA_INVALID_INPUT", path);
163
- }
164
- const output = {};
165
- for (const key of keys) {
166
- if (typeof key !== "string" || !allowed.has(key))
167
- throw new KaladaFailure("KALADA_INVALID_INPUT", [...path, String(key)]);
168
- try {
169
- output[key] = dataValue(input, key);
170
- } catch {
171
- throw new KaladaFailure("KALADA_INVALID_INPUT", [...path, key]);
172
- }
173
- }
174
- if (requireExact && keys.length !== allowed.size)
175
- throw new KaladaFailure("KALADA_INVALID_INPUT", path);
176
- return output;
177
- }
178
- function exact(raw, path, keys, optionalLast = false) {
179
- const minimum = optionalLast ? keys.length - 1 : keys.length;
180
- if (Object.keys(raw).length < minimum || Object.keys(raw).length > keys.length)
181
- throw new KaladaFailure("KALADA_INVALID_INPUT", path);
182
- for (let index = 0; index < minimum; index += 1) {
183
- const key = keys[index];
184
- if (key !== void 0 && !(key in raw))
185
- throw new KaladaFailure("KALADA_INVALID_INPUT", [...path, key]);
186
- }
187
- for (const key of Object.keys(raw))
188
- if (!keys.includes(key)) throw new KaladaFailure("KALADA_INVALID_INPUT", [...path, key]);
189
- }
190
- function strictArray(input, path) {
191
- let keys;
192
- try {
193
- keys = Reflect.ownKeys(input);
194
- } catch {
195
- throw new KaladaFailure("KALADA_INVALID_INPUT", path);
196
- }
197
- if (keys.length !== input.length + 1) throw new KaladaFailure("KALADA_INVALID_INPUT", path);
198
- return Array.from({ length: input.length }, (_, index) => {
199
- try {
200
- return dataValue(input, String(index));
201
- } catch {
202
- throw new KaladaFailure("KALADA_INVALID_INPUT", [...path, index]);
203
- }
204
- });
205
- }
206
- function safeJson(input, path, state) {
207
- try {
208
- const result = cloneJsonWithStats(input, {
209
- maxDepth: state.limits.maxValueDepth,
210
- maxNodes: state.limits.maxValueNodes - state.valueNodes,
211
- maxStringLength: state.limits.maxStringLength
212
- });
213
- state.valueNodes += result.nodes;
214
- return result.value;
215
- } catch (error) {
216
- if (error instanceof RangeError) throw new KaladaFailure("KALADA_LIMIT_EXCEEDED", path);
217
- throw new KaladaFailure("KALADA_INVALID_INPUT", path);
218
- }
219
- }
220
- function inspectJson(input, path, state) {
221
- try {
222
- return cloneJson(input, {
223
- maxDepth: state.limits.maxValueDepth,
224
- maxNodes: state.limits.maxValueNodes,
225
- maxStringLength: state.limits.maxStringLength
226
- });
227
- } catch (error) {
228
- if (error instanceof RangeError) throw new KaladaFailure("KALADA_LIMIT_EXCEEDED", path);
229
- throw new KaladaFailure("KALADA_INVALID_INPUT", path);
230
- }
231
- }
232
- function referenceLength(reference) {
233
- return typeof reference === "string" ? [...reference].length : [...canonicalJsonIdentity(reference)].length;
234
- }
235
- function bindingName(input, path, limits) {
236
- if (typeof input !== "string" || input.length === 0)
237
- throw new KaladaFailure("KALADA_INVALID_INPUT", path);
238
- if ([...input].length > limits.maxReferenceLength)
239
- throw new KaladaFailure("KALADA_LIMIT_EXCEEDED", path);
240
- return input;
241
- }
242
- function safeValidate(validate, input) {
243
- try {
244
- return validate(input) === true;
245
- } catch {
246
- return false;
247
- }
248
- }
249
- function safeCanonicalize(canonicalize, input, path) {
250
- try {
251
- return canonicalize(input);
252
- } catch {
253
- throw new KaladaFailure("KALADA_INVALID_REFERENCE", path);
254
- }
255
- }
256
- function count(path, depth, state) {
257
- state.astNodes += 1;
258
- if (depth > state.limits.maxAstDepth || state.astNodes > state.limits.maxAstNodes)
259
- throw new KaladaFailure("KALADA_LIMIT_EXCEEDED", path);
260
- }
261
224
 
262
225
  export { canonicalizeKaladaV1Program };
263
226
  //# sourceMappingURL=canonicalize.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/canonicalize.ts"],"names":[],"mappings":"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","file":"canonicalize.js","sourcesContent":["import { failure, KaladaFailure, success } from \"./diagnostics.js\";\nimport {\n canonicalJsonIdentity,\n cloneJson,\n cloneJsonWithStats,\n dataValue,\n type JsonValue,\n} from \"./json.js\";\nimport { resolveLimits } from \"./limits.js\";\nimport type {\n KaladaV1Expression,\n KaladaV1Limits,\n KaladaV1Options,\n KaladaV1Outcome,\n KaladaV1Program,\n MatchArm,\n} from \"./types.js\";\n\ntype Path = readonly (string | number)[];\ninterface State<R extends JsonValue> {\n readonly limits: KaladaV1Limits;\n readonly options: KaladaV1Options<R>;\n readonly active: WeakSet<object>;\n astNodes: number;\n valueNodes: number;\n}\n\nconst NODE_KEYS = new Set([\"kind\", \"value\", \"ref\", \"name\", \"body\", \"variant\", \"type\", \"arms\"]);\nconst ARM_ORDER = Object.freeze({ Option: [\"some\", \"none\"], Result: [\"ok\", \"err\"] } as const);\n\nexport function canonicalizeKaladaV1Program<R extends JsonValue = string>(\n input: unknown,\n options: KaladaV1Options<R> = {},\n): KaladaV1Outcome<KaladaV1Program<R>> {\n try {\n const limits = resolveLimits(options.limits);\n const fields = properties(input, [], new Set([\"format\", \"version\", \"profile\", \"expression\"]));\n if (\n fields.format !== \"kalada-program\" ||\n fields.version !== 1 ||\n fields.profile !== \"kalada-v1\"\n ) {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", []);\n }\n const state: State<R> = {\n limits,\n options,\n active: new WeakSet(),\n astNodes: 0,\n valueNodes: 0,\n };\n const expression = canonicalNode(fields.expression, [\"expression\"], 0, state);\n return success(\n Object.freeze({ format: \"kalada-program\", version: 1, profile: \"kalada-v1\", expression }),\n );\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}\n\nfunction canonicalNode<R extends JsonValue>(\n input: unknown,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n count(path, depth, state);\n if (typeof input !== \"object\" || input === null || state.active.has(input)) {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n }\n state.active.add(input);\n try {\n const raw = properties(input, path, NODE_KEYS, false);\n if (raw.kind === \"literal\") return canonicalLiteral(raw, path, state);\n if (raw.kind === \"ref\") return canonicalReference(raw, path, state);\n if (raw.kind === \"binding\") return canonicalBinding(raw, path, depth, state);\n if (raw.kind === \"option\") return canonicalOption(raw, path, depth, state);\n if (raw.kind === \"result\") return canonicalResult(raw, path, depth, state);\n if (raw.kind === \"match\") return canonicalMatch(raw, path, depth, state);\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"kind\"]);\n } finally {\n state.active.delete(input);\n }\n}\n\nfunction canonicalLiteral<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n state: State<R>,\n): KaladaV1Expression<R> {\n exact(raw, path, [\"kind\", \"value\"]);\n return Object.freeze({\n kind: \"literal\",\n value: safeJson(raw.value, [...path, \"value\"], state),\n });\n}\n\nfunction canonicalReference<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n state: State<R>,\n): KaladaV1Expression<R> {\n exact(raw, path, [\"kind\", \"ref\"]);\n const refPath = [...path, \"ref\"];\n const codec = state.options.reference;\n const ref = (\n codec ? inspectJson(raw.ref, refPath, state) : safeJson(raw.ref, refPath, state)\n ) as R;\n if (codec ? !safeValidate(codec.validate, ref) : typeof ref !== \"string\" || ref.length === 0) {\n throw new KaladaFailure(\"KALADA_INVALID_REFERENCE\", refPath);\n }\n const replacement = codec?.canonicalize\n ? safeCanonicalize(codec.canonicalize, ref, refPath)\n : ref;\n const output = (codec ? safeJson(replacement, refPath, state) : replacement) as R;\n if (codec && !safeValidate(codec.validate, output))\n throw new KaladaFailure(\"KALADA_INVALID_REFERENCE\", refPath);\n if (referenceLength(output) > state.limits.maxReferenceLength)\n throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", refPath);\n return Object.freeze({ kind: \"ref\", ref: output });\n}\n\nfunction canonicalBinding<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n exact(raw, path, [\"kind\", \"name\", \"value\", \"body\"]);\n const name = bindingName(raw.name, [...path, \"name\"], state.limits);\n return Object.freeze({\n kind: \"binding\",\n name,\n value: canonicalNode(raw.value, [...path, \"value\"], depth + 1, state),\n body: canonicalNode(raw.body, [...path, \"body\"], depth + 1, state),\n });\n}\n\nfunction canonicalOption<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n if (raw.variant === \"none\") {\n exact(raw, path, [\"kind\", \"variant\"]);\n return Object.freeze({ kind: \"option\", variant: \"none\" });\n }\n if (raw.variant !== \"some\") throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"variant\"]);\n exact(raw, path, [\"kind\", \"variant\", \"value\"]);\n return Object.freeze({\n kind: \"option\",\n variant: \"some\",\n value: canonicalNode(raw.value, [...path, \"value\"], depth + 1, state),\n });\n}\n\nfunction canonicalResult<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n if (raw.variant !== \"ok\" && raw.variant !== \"err\")\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"variant\"]);\n exact(raw, path, [\"kind\", \"variant\", \"value\"]);\n return Object.freeze({\n kind: \"result\",\n variant: raw.variant,\n value: canonicalNode(raw.value, [...path, \"value\"], depth + 1, state),\n });\n}\n\nfunction canonicalMatch<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n exact(raw, path, [\"kind\", \"type\", \"value\", \"arms\"]);\n if (raw.type !== \"Option\" && raw.type !== \"Result\")\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"type\"]);\n const value = canonicalNode(raw.value, [...path, \"value\"], depth + 1, state);\n const arms = canonicalArms(raw.arms, raw.type, path, depth, state);\n return Object.freeze({ kind: \"match\", type: raw.type, value, arms });\n}\n\nfunction canonicalArms<R extends JsonValue>(\n input: unknown,\n type: \"Option\" | \"Result\",\n path: Path,\n depth: number,\n state: State<R>,\n): readonly MatchArm<R>[] {\n if (!Array.isArray(input)) throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"arms\"]);\n const entries = strictArray(input, [...path, \"arms\"]);\n const expected: readonly string[] = ARM_ORDER[type];\n const found = new Map<string, MatchArm<R>>();\n entries.forEach((entry, index) => {\n addArm(entry, index, type, expected, found, path, depth, state);\n });\n if (found.size !== expected.length)\n throw new KaladaFailure(\"KALADA_MATCH_MISSING_ARM\", [...path, \"arms\"]);\n return Object.freeze(expected.map((variant) => requiredArm(found, variant, path)));\n}\n\nfunction addArm<R extends JsonValue>(\n input: unknown,\n index: number,\n type: \"Option\" | \"Result\",\n expected: readonly string[],\n found: Map<string, MatchArm<R>>,\n path: Path,\n depth: number,\n state: State<R>,\n): void {\n const armPath = [...path, \"arms\", index];\n const raw = properties(input, armPath, new Set([\"variant\", \"binding\", \"body\"]), false);\n if (found.size === expected.length)\n throw new KaladaFailure(\"KALADA_MATCH_UNREACHABLE_ARM\", armPath);\n if (typeof raw.variant !== \"string\" || !expected.includes(raw.variant))\n throw new KaladaFailure(\"KALADA_MATCH_UNKNOWN_ARM\", [...armPath, \"variant\"]);\n if (found.has(raw.variant))\n throw new KaladaFailure(\"KALADA_MATCH_DUPLICATE_ARM\", [...armPath, \"variant\"]);\n const allowsBinding = raw.variant !== \"none\";\n if (!allowsBinding && \"binding\" in raw)\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...armPath, \"binding\"]);\n exact(\n raw,\n armPath,\n allowsBinding ? [\"variant\", \"body\", \"binding\"] : [\"variant\", \"body\"],\n allowsBinding,\n );\n const binding =\n raw.binding === undefined\n ? undefined\n : bindingName(raw.binding, [...armPath, \"binding\"], state.limits);\n const body = canonicalNode(raw.body, [...armPath, \"body\"], depth + 1, state);\n found.set(\n raw.variant,\n Object.freeze({ variant: raw.variant, ...(binding ? { binding } : {}), body }) as MatchArm<R>,\n );\n void type;\n}\n\nfunction requiredArm<R extends JsonValue>(\n found: Map<string, MatchArm<R>>,\n variant: string,\n path: Path,\n): MatchArm<R> {\n const arm = found.get(variant);\n if (!arm) throw new KaladaFailure(\"KALADA_MATCH_MISSING_ARM\", [...path, \"arms\"]);\n return arm;\n}\n\nfunction properties(\n input: unknown,\n path: Path,\n allowed: ReadonlySet<string>,\n requireExact = true,\n): Record<string, unknown> {\n if (typeof input !== \"object\" || input === null || Array.isArray(input))\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n let keys: PropertyKey[];\n try {\n keys = Reflect.ownKeys(input);\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n }\n const output: Record<string, unknown> = {};\n for (const key of keys) {\n if (typeof key !== \"string\" || !allowed.has(key))\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, String(key)]);\n try {\n output[key] = dataValue(input, key);\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, key]);\n }\n }\n if (requireExact && keys.length !== allowed.size)\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n return output;\n}\n\nfunction exact(\n raw: Record<string, unknown>,\n path: Path,\n keys: readonly string[],\n optionalLast = false,\n): void {\n const minimum = optionalLast ? keys.length - 1 : keys.length;\n if (Object.keys(raw).length < minimum || Object.keys(raw).length > keys.length)\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n for (let index = 0; index < minimum; index += 1) {\n const key = keys[index];\n if (key !== undefined && !(key in raw))\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, key]);\n }\n for (const key of Object.keys(raw))\n if (!keys.includes(key)) throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, key]);\n}\n\nfunction strictArray(input: unknown[], path: Path): unknown[] {\n let keys: PropertyKey[];\n try {\n keys = Reflect.ownKeys(input);\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n }\n if (keys.length !== input.length + 1) throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n return Array.from({ length: input.length }, (_, index) => {\n try {\n return dataValue(input, String(index));\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, index]);\n }\n });\n}\n\nfunction safeJson<R extends JsonValue>(input: unknown, path: Path, state: State<R>): JsonValue {\n try {\n const result = cloneJsonWithStats(input, {\n maxDepth: state.limits.maxValueDepth,\n maxNodes: state.limits.maxValueNodes - state.valueNodes,\n maxStringLength: state.limits.maxStringLength,\n });\n state.valueNodes += result.nodes;\n return result.value;\n } catch (error) {\n if (error instanceof RangeError) throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n }\n}\n\nfunction inspectJson<R extends JsonValue>(input: unknown, path: Path, state: State<R>): JsonValue {\n try {\n return cloneJson(input, {\n maxDepth: state.limits.maxValueDepth,\n maxNodes: state.limits.maxValueNodes,\n maxStringLength: state.limits.maxStringLength,\n });\n } catch (error) {\n if (error instanceof RangeError) throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n }\n}\n\nfunction referenceLength(reference: JsonValue): number {\n return typeof reference === \"string\"\n ? [...reference].length\n : [...canonicalJsonIdentity(reference)].length;\n}\n\nfunction bindingName(input: unknown, path: Path, limits: KaladaV1Limits): string {\n if (typeof input !== \"string\" || input.length === 0)\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n if ([...input].length > limits.maxReferenceLength)\n throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n return input;\n}\n\nfunction safeValidate<R>(validate: (input: unknown) => input is R, input: unknown): input is R {\n try {\n return validate(input) === true;\n } catch {\n return false;\n }\n}\n\nfunction safeCanonicalize<R>(canonicalize: (input: R) => R, input: R, path: Path): R {\n try {\n return canonicalize(input);\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_REFERENCE\", path);\n }\n}\n\nfunction count<R extends JsonValue>(path: Path, depth: number, state: State<R>): void {\n state.astNodes += 1;\n if (depth > state.limits.maxAstDepth || state.astNodes > state.limits.maxAstNodes)\n throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/canonicalize.ts"],"names":[],"mappings":"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","file":"canonicalize.js","sourcesContent":["import {\n bindingName,\n count,\n exact,\n inspectJson,\n type Path,\n properties,\n referenceLength,\n type CanonicalState as State,\n safeCanonicalize,\n safeJson,\n safeValidate,\n strictArray,\n} from \"./canonical-input.js\";\nimport { failure, KaladaFailure, success } from \"./diagnostics.js\";\nimport {\n canonicalCall,\n canonicalCoreFunction,\n canonicalFunction,\n canonicalGroup,\n} from \"./function-contracts.js\";\nimport type { JsonValue } from \"./json.js\";\nimport { resolveLimits } from \"./limits.js\";\nimport type {\n KaladaV1Expression,\n KaladaV1Options,\n KaladaV1Outcome,\n KaladaV1Program,\n MatchArm,\n} from \"./types.js\";\n\nconst NODE_KEYS = new Set([\n \"kind\",\n \"value\",\n \"ref\",\n \"name\",\n \"body\",\n \"variant\",\n \"type\",\n \"arms\",\n \"milliseconds\",\n \"operator\",\n \"left\",\n \"right\",\n \"parameters\",\n \"returns\",\n \"callee\",\n \"arguments\",\n \"functions\",\n]);\nconst ARM_ORDER = Object.freeze({ Option: [\"some\", \"none\"], Result: [\"ok\", \"err\"] } as const);\n\nexport function canonicalizeKaladaV1Program<R extends JsonValue = string>(\n input: unknown,\n options: KaladaV1Options<R> = {},\n): KaladaV1Outcome<KaladaV1Program<R>> {\n try {\n const limits = resolveLimits(options.limits);\n const fields = properties(input, [], new Set([\"format\", \"version\", \"profile\", \"expression\"]));\n if (\n fields.format !== \"kalada-program\" ||\n fields.version !== 1 ||\n fields.profile !== \"kalada-v1\"\n ) {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", []);\n }\n const state: State<R> = {\n limits,\n options,\n active: new WeakSet(),\n astNodes: 0,\n valueNodes: 0,\n };\n const expression = canonicalNode(fields.expression, [\"expression\"], 0, state);\n return success(\n Object.freeze({ format: \"kalada-program\", version: 1, profile: \"kalada-v1\", expression }),\n );\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}\n\nfunction canonicalNode<R extends JsonValue>(\n input: unknown,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n count(path, depth, state);\n if (typeof input !== \"object\" || input === null || state.active.has(input)) {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n }\n state.active.add(input);\n try {\n const raw = properties(input, path, NODE_KEYS, false);\n if (raw.kind === \"literal\") return canonicalLiteral(raw, path, state);\n if (raw.kind === \"ref\") return canonicalReference(raw, path, state);\n const added = canonicalAddedNode(raw, path, depth, state);\n if (added) return added;\n if (raw.kind === \"binding\") return canonicalBinding(raw, path, depth, state);\n if (raw.kind === \"option\") return canonicalOption(raw, path, depth, state);\n if (raw.kind === \"result\") return canonicalResult(raw, path, depth, state);\n if (raw.kind === \"match\") return canonicalMatch(raw, path, depth, state);\n if (raw.kind === \"instant\" || raw.kind === \"duration\") return canonicalTemporal(raw, path);\n if (raw.kind === \"current-instant\") return canonicalCurrentInstant(raw, path);\n if (raw.kind === \"temporal-arithmetic\") {\n return canonicalTemporalOperation(raw, path, depth, state, [\"add\", \"subtract\"]);\n }\n if (raw.kind === \"temporal-comparison\") {\n return canonicalTemporalOperation(raw, path, depth, state, [\n \"equal\",\n \"not-equal\",\n \"less-than\",\n \"less-than-or-equal\",\n \"greater-than\",\n \"greater-than-or-equal\",\n ]);\n }\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"kind\"]);\n } finally {\n state.active.delete(input);\n }\n}\n\nfunction canonicalAddedNode<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> | undefined {\n if (raw.kind === \"function\") return canonicalFunction(raw, path, depth, state, canonicalNode);\n if (raw.kind === \"call\") return canonicalCall(raw, path, depth, state, canonicalNode);\n if (raw.kind === \"function-group\") return canonicalGroup(raw, path, depth, state, canonicalNode);\n if (raw.kind === \"core-function\") return canonicalCoreFunction(raw, path);\n return undefined;\n}\n\nfunction canonicalTemporal(\n raw: Record<string, unknown>,\n path: Path,\n): Extract<KaladaV1Expression, { kind: \"instant\" | \"duration\" }> {\n exact(raw, path, [\"kind\", \"milliseconds\"]);\n if (!Number.isSafeInteger(raw.milliseconds)) {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"milliseconds\"]);\n }\n return Object.freeze({\n kind: raw.kind,\n milliseconds: Object.is(raw.milliseconds, -0) ? 0 : raw.milliseconds,\n }) as Extract<KaladaV1Expression, { kind: \"instant\" | \"duration\" }>;\n}\n\nfunction canonicalCurrentInstant(\n raw: Record<string, unknown>,\n path: Path,\n): Extract<KaladaV1Expression, { kind: \"current-instant\" }> {\n exact(raw, path, [\"kind\"]);\n return Object.freeze({ kind: \"current-instant\" });\n}\n\nfunction canonicalTemporalOperation<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n operators: readonly string[],\n): KaladaV1Expression<R> {\n exact(raw, path, [\"kind\", \"operator\", \"left\", \"right\"]);\n if (typeof raw.operator !== \"string\" || !operators.includes(raw.operator)) {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"operator\"]);\n }\n return Object.freeze({\n kind: raw.kind,\n operator: raw.operator,\n left: canonicalNode(raw.left, [...path, \"left\"], depth + 1, state),\n right: canonicalNode(raw.right, [...path, \"right\"], depth + 1, state),\n }) as KaladaV1Expression<R>;\n}\n\nfunction canonicalLiteral<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n state: State<R>,\n): KaladaV1Expression<R> {\n exact(raw, path, [\"kind\", \"value\"]);\n return Object.freeze({\n kind: \"literal\",\n value: safeJson(raw.value, [...path, \"value\"], state),\n });\n}\n\nfunction canonicalReference<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n state: State<R>,\n): KaladaV1Expression<R> {\n exact(raw, path, [\"kind\", \"ref\"]);\n const refPath = [...path, \"ref\"];\n const codec = state.options.reference;\n const ref = (\n codec ? inspectJson(raw.ref, refPath, state) : safeJson(raw.ref, refPath, state)\n ) as R;\n if (codec ? !safeValidate(codec.validate, ref) : typeof ref !== \"string\" || ref.length === 0) {\n throw new KaladaFailure(\"KALADA_INVALID_REFERENCE\", refPath);\n }\n const replacement = codec?.canonicalize\n ? safeCanonicalize(codec.canonicalize, ref, refPath)\n : ref;\n const output = (codec ? safeJson(replacement, refPath, state) : replacement) as R;\n if (codec && !safeValidate(codec.validate, output))\n throw new KaladaFailure(\"KALADA_INVALID_REFERENCE\", refPath);\n if (referenceLength(output) > state.limits.maxReferenceLength)\n throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", refPath);\n return Object.freeze({ kind: \"ref\", ref: output });\n}\n\nfunction canonicalBinding<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n exact(raw, path, [\"kind\", \"name\", \"value\", \"body\"]);\n const name = bindingName(raw.name, [...path, \"name\"], state.limits);\n return Object.freeze({\n kind: \"binding\",\n name,\n value: canonicalNode(raw.value, [...path, \"value\"], depth + 1, state),\n body: canonicalNode(raw.body, [...path, \"body\"], depth + 1, state),\n });\n}\n\nfunction canonicalOption<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n if (raw.variant === \"none\") {\n exact(raw, path, [\"kind\", \"variant\"]);\n return Object.freeze({ kind: \"option\", variant: \"none\" });\n }\n if (raw.variant !== \"some\") throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"variant\"]);\n exact(raw, path, [\"kind\", \"variant\", \"value\"]);\n return Object.freeze({\n kind: \"option\",\n variant: \"some\",\n value: canonicalNode(raw.value, [...path, \"value\"], depth + 1, state),\n });\n}\n\nfunction canonicalResult<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n if (raw.variant !== \"ok\" && raw.variant !== \"err\")\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"variant\"]);\n exact(raw, path, [\"kind\", \"variant\", \"value\"]);\n return Object.freeze({\n kind: \"result\",\n variant: raw.variant,\n value: canonicalNode(raw.value, [...path, \"value\"], depth + 1, state),\n });\n}\n\nfunction canonicalMatch<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n exact(raw, path, [\"kind\", \"type\", \"value\", \"arms\"]);\n if (raw.type !== \"Option\" && raw.type !== \"Result\")\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"type\"]);\n const value = canonicalNode(raw.value, [...path, \"value\"], depth + 1, state);\n const arms = canonicalArms(raw.arms, raw.type, path, depth, state);\n return Object.freeze({ kind: \"match\", type: raw.type, value, arms });\n}\n\nfunction canonicalArms<R extends JsonValue>(\n input: unknown,\n type: \"Option\" | \"Result\",\n path: Path,\n depth: number,\n state: State<R>,\n): readonly MatchArm<R>[] {\n if (!Array.isArray(input)) throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"arms\"]);\n const entries = strictArray(input, [...path, \"arms\"]);\n const expected: readonly string[] = ARM_ORDER[type];\n const found = new Map<string, MatchArm<R>>();\n entries.forEach((entry, index) => {\n addArm(entry, index, type, expected, found, path, depth, state);\n });\n if (found.size !== expected.length)\n throw new KaladaFailure(\"KALADA_MATCH_MISSING_ARM\", [...path, \"arms\"]);\n return Object.freeze(expected.map((variant) => requiredArm(found, variant, path)));\n}\n\nfunction addArm<R extends JsonValue>(\n input: unknown,\n index: number,\n type: \"Option\" | \"Result\",\n expected: readonly string[],\n found: Map<string, MatchArm<R>>,\n path: Path,\n depth: number,\n state: State<R>,\n): void {\n const armPath = [...path, \"arms\", index];\n const raw = properties(input, armPath, new Set([\"variant\", \"binding\", \"body\"]), false);\n if (found.size === expected.length)\n throw new KaladaFailure(\"KALADA_MATCH_UNREACHABLE_ARM\", armPath);\n if (typeof raw.variant !== \"string\" || !expected.includes(raw.variant))\n throw new KaladaFailure(\"KALADA_MATCH_UNKNOWN_ARM\", [...armPath, \"variant\"]);\n if (found.has(raw.variant))\n throw new KaladaFailure(\"KALADA_MATCH_DUPLICATE_ARM\", [...armPath, \"variant\"]);\n const allowsBinding = raw.variant !== \"none\";\n if (!allowsBinding && \"binding\" in raw)\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...armPath, \"binding\"]);\n exact(\n raw,\n armPath,\n allowsBinding ? [\"variant\", \"body\", \"binding\"] : [\"variant\", \"body\"],\n allowsBinding,\n );\n const binding =\n raw.binding === undefined\n ? undefined\n : bindingName(raw.binding, [...armPath, \"binding\"], state.limits);\n const body = canonicalNode(raw.body, [...armPath, \"body\"], depth + 1, state);\n found.set(\n raw.variant,\n Object.freeze({ variant: raw.variant, ...(binding ? { binding } : {}), body }) as MatchArm<R>,\n );\n void type;\n}\n\nfunction requiredArm<R extends JsonValue>(\n found: Map<string, MatchArm<R>>,\n variant: string,\n path: Path,\n): MatchArm<R> {\n const arm = found.get(variant);\n if (!arm) throw new KaladaFailure(\"KALADA_MATCH_MISSING_ARM\", [...path, \"arms\"]);\n return arm;\n}\n"]}
@@ -2,6 +2,7 @@
2
2
 
3
3
  var json_js = require('./json.js');
4
4
  var limits_js = require('./limits.js');
5
+ var temporal_js = require('./temporal.js');
5
6
  var values_js = require('./values.js');
6
7
 
7
8
  const INVALID = "Invalid kalada-value v1 envelope.";
@@ -25,6 +26,10 @@ function encodeKaladaValue(value) {
25
26
  frames.push({ type: current.type, variant: current.variant });
26
27
  current = current.value;
27
28
  }
29
+ if (temporal_js.isInstant(current) || temporal_js.isDuration(current)) {
30
+ charge(nodes, frames.length);
31
+ return wrapFrames(frozenTemporal(current.type, current.milliseconds), frames);
32
+ }
28
33
  const remaining = LIMITS.maxNodes - charge(nodes, frames.length);
29
34
  const json = json_js.cloneJsonWithStats(current, {
30
35
  ...LIMITS,
@@ -44,6 +49,8 @@ function decodeKaladaValue(input) {
44
49
  if (active.has(envelope)) throw new TypeError(INVALID);
45
50
  active.add(envelope);
46
51
  const fields = envelopeFields(envelope);
52
+ const temporal = decodeTemporal(envelope, fields);
53
+ if (temporal) return wrapValues(temporal, frames);
47
54
  if (fields.type === "Json" && fields.variant === "value") {
48
55
  assertKeys(envelope, ["format", "version", "type", "variant", "value"]);
49
56
  const value = decodeJson(json_js.dataValue(envelope, "value"), nodes, frames.length);
@@ -58,6 +65,14 @@ function decodeKaladaValue(input) {
58
65
  current = json_js.dataValue(envelope, "value");
59
66
  }
60
67
  }
68
+ function decodeTemporal(envelope, fields) {
69
+ if (fields.type !== "Instant" && fields.type !== "Duration") return void 0;
70
+ if (fields.variant !== "milliseconds") throw new TypeError(INVALID);
71
+ assertKeys(envelope, ["format", "version", "type", "variant", "value"]);
72
+ const value = json_js.dataValue(envelope, "value");
73
+ if (typeof value !== "number" || !Number.isSafeInteger(value)) throw new TypeError(INVALID);
74
+ return fields.type === "Instant" ? temporal_js.Instant.fromMilliseconds(value) : temporal_js.Duration.fromMilliseconds(value);
75
+ }
61
76
  function decodeJson(input, nodes, depth) {
62
77
  return json_js.cloneJson(input, {
63
78
  ...LIMITS,
@@ -142,6 +157,15 @@ function frozenJson(value) {
142
157
  value
143
158
  });
144
159
  }
160
+ function frozenTemporal(type, value) {
161
+ return Object.freeze({
162
+ format: "kalada-value",
163
+ version: 1,
164
+ type,
165
+ variant: "milliseconds",
166
+ value
167
+ });
168
+ }
145
169
 
146
170
  exports.decodeKaladaValue = decodeKaladaValue;
147
171
  exports.encodeKaladaValue = encodeKaladaValue;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/codec.ts"],"names":["DEFAULT_KALADA_V1_LIMITS","isOption","isResult","cloneJsonWithStats","dataValue","Option","cloneJson","Result"],"mappings":"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","file":"codec.cjs","sourcesContent":["import { cloneJson, cloneJsonWithStats, dataValue, type JsonValue } from \"./json.js\";\nimport { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\nimport { isOption, isResult, type KaladaValue, Option, Result } from \"./values.js\";\n\ninterface EncodedHeader {\n readonly format: \"kalada-value\";\n readonly version: 1;\n}\n\nexport type EncodedKaladaValueV1 =\n | (EncodedHeader & {\n readonly type: \"Json\";\n readonly variant: \"value\";\n readonly value: JsonValue;\n })\n | (EncodedHeader & { readonly type: \"Option\"; readonly variant: \"none\" })\n | (EncodedHeader & {\n readonly type: \"Option\";\n readonly variant: \"some\";\n readonly value: EncodedKaladaValueV1;\n })\n | (EncodedHeader & {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n readonly value: EncodedKaladaValueV1;\n });\n\ntype Frame =\n | { readonly type: \"Option\"; readonly variant: \"some\" }\n | {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n };\n\nconst INVALID = \"Invalid kalada-value v1 envelope.\";\nconst LIMITS = Object.freeze({\n maxDepth: DEFAULT_KALADA_V1_LIMITS.maxValueDepth,\n maxNodes: DEFAULT_KALADA_V1_LIMITS.maxValueNodes,\n maxStringLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength,\n});\n\nexport function encodeKaladaValue(value: KaladaValue): EncodedKaladaValueV1 {\n const frames: Frame[] = [];\n const seen = new WeakSet<object>();\n let current = value;\n let nodes = 0;\n while (isOption(current) || isResult(current)) {\n nodes = charge(nodes, frames.length);\n if (seen.has(current)) throw new TypeError(INVALID);\n seen.add(current);\n if (isOption(current) && current.variant === \"none\") {\n return wrapFrames(frozenNone(), frames);\n }\n frames.push({ type: current.type, variant: current.variant } as Frame);\n current = current.value;\n }\n const remaining = LIMITS.maxNodes - charge(nodes, frames.length);\n const json = cloneJsonWithStats(current, {\n ...LIMITS,\n maxDepth: remainingDepth(frames.length),\n maxNodes: remaining,\n });\n return wrapFrames(frozenJson(json.value), frames);\n}\n\nexport function decodeKaladaValue(input: unknown): KaladaValue {\n const frames: Frame[] = [];\n const active = new WeakSet<object>();\n let current = input;\n let nodes = 0;\n while (true) {\n nodes = charge(nodes, frames.length);\n const envelope = envelopeObject(current);\n if (active.has(envelope)) throw new TypeError(INVALID);\n active.add(envelope);\n const fields = envelopeFields(envelope);\n if (fields.type === \"Json\" && fields.variant === \"value\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n const value = decodeJson(dataValue(envelope, \"value\"), nodes, frames.length);\n return wrapValues(value, frames);\n }\n if (fields.type === \"Option\" && fields.variant === \"none\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\"]);\n return wrapValues(Option.none(), frames);\n }\n frames.push(payloadFrame(fields.type, fields.variant));\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n current = dataValue(envelope, \"value\");\n }\n}\n\nfunction decodeJson(input: unknown, nodes: number, depth: number): JsonValue {\n return cloneJson(input, {\n ...LIMITS,\n maxDepth: remainingDepth(depth),\n maxNodes: LIMITS.maxNodes - nodes,\n });\n}\n\nfunction envelopeObject(input: unknown): object {\n if (typeof input !== \"object\" || input === null || Array.isArray(input))\n throw new TypeError(INVALID);\n try {\n const prototype = Object.getPrototypeOf(input);\n if (prototype !== Object.prototype && prototype !== null) throw new TypeError(INVALID);\n return input;\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction envelopeFields(input: object): { type: unknown; variant: unknown } {\n try {\n if (dataValue(input, \"format\") !== \"kalada-value\" || dataValue(input, \"version\") !== 1) {\n throw new TypeError(INVALID);\n }\n return { type: dataValue(input, \"type\"), variant: dataValue(input, \"variant\") };\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction payloadFrame(type: unknown, variant: unknown): Frame {\n if (type === \"Option\" && variant === \"some\") return { type, variant };\n if (type === \"Result\" && (variant === \"ok\" || variant === \"err\")) return { type, variant };\n throw new TypeError(INVALID);\n}\n\nfunction assertKeys(input: object, expected: readonly string[]): void {\n let keys: PropertyKey[];\n try {\n keys = Reflect.ownKeys(input);\n } catch {\n throw new TypeError(INVALID);\n }\n if (\n keys.length !== expected.length ||\n !keys.every((key) => typeof key === \"string\" && expected.includes(key))\n ) {\n throw new TypeError(INVALID);\n }\n}\n\nfunction wrapFrames(leaf: EncodedKaladaValueV1, frames: readonly Frame[]): EncodedKaladaValueV1 {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output = Object.freeze({ format: \"kalada-value\", version: 1, ...frame, value: output });\n }\n return output;\n}\n\nfunction wrapValues(leaf: KaladaValue, frames: readonly Frame[]): KaladaValue {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output =\n frame.type === \"Option\"\n ? Option.some(output)\n : frame.variant === \"ok\"\n ? Result.ok(output)\n : Result.err(output);\n }\n return output;\n}\n\nfunction charge(nodes: number, depth: number): number {\n if (depth > LIMITS.maxDepth || nodes >= LIMITS.maxNodes)\n throw new RangeError(\"Kalada value exceeds its limits.\");\n return nodes + 1;\n}\n\nfunction remainingDepth(depth: number): number {\n const remaining = LIMITS.maxDepth - depth;\n if (remaining < 0) throw new RangeError(\"Kalada value exceeds its limits.\");\n return remaining;\n}\n\nfunction frozenNone(): EncodedKaladaValueV1 {\n return Object.freeze({ format: \"kalada-value\", version: 1, type: \"Option\", variant: \"none\" });\n}\n\nfunction frozenJson(value: JsonValue): EncodedKaladaValueV1 {\n return Object.freeze({\n format: \"kalada-value\",\n version: 1,\n type: \"Json\",\n variant: \"value\",\n value,\n });\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/codec.ts"],"names":["DEFAULT_KALADA_V1_LIMITS","isOption","isResult","isInstant","isDuration","cloneJsonWithStats","dataValue","Option","Instant","Duration","cloneJson","Result"],"mappings":"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","file":"codec.cjs","sourcesContent":["import { cloneJson, cloneJsonWithStats, dataValue, type JsonValue } from \"./json.js\";\nimport { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\nimport {\n Duration,\n type DurationValue,\n Instant,\n type InstantValue,\n isDuration,\n isInstant,\n} from \"./temporal.js\";\nimport { isOption, isResult, type KaladaValue, Option, Result } from \"./values.js\";\n\ninterface EncodedHeader {\n readonly format: \"kalada-value\";\n readonly version: 1;\n}\n\nexport type EncodedKaladaValueV1 =\n | (EncodedHeader & {\n readonly type: \"Json\";\n readonly variant: \"value\";\n readonly value: JsonValue;\n })\n | (EncodedHeader & { readonly type: \"Option\"; readonly variant: \"none\" })\n | (EncodedHeader & {\n readonly type: \"Option\";\n readonly variant: \"some\";\n readonly value: EncodedKaladaValueV1;\n })\n | (EncodedHeader & {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n readonly value: EncodedKaladaValueV1;\n })\n | (EncodedHeader & {\n readonly type: \"Instant\" | \"Duration\";\n readonly variant: \"milliseconds\";\n readonly value: number;\n });\n\ntype Frame =\n | { readonly type: \"Option\"; readonly variant: \"some\" }\n | {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n };\n\nconst INVALID = \"Invalid kalada-value v1 envelope.\";\nconst LIMITS = Object.freeze({\n maxDepth: DEFAULT_KALADA_V1_LIMITS.maxValueDepth,\n maxNodes: DEFAULT_KALADA_V1_LIMITS.maxValueNodes,\n maxStringLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength,\n});\n\nexport function encodeKaladaValue(value: KaladaValue): EncodedKaladaValueV1 {\n const frames: Frame[] = [];\n const seen = new WeakSet<object>();\n let current = value;\n let nodes = 0;\n while (isOption(current) || isResult(current)) {\n nodes = charge(nodes, frames.length);\n if (seen.has(current)) throw new TypeError(INVALID);\n seen.add(current);\n if (isOption(current) && current.variant === \"none\") {\n return wrapFrames(frozenNone(), frames);\n }\n frames.push({ type: current.type, variant: current.variant } as Frame);\n current = current.value;\n }\n if (isInstant(current) || isDuration(current)) {\n charge(nodes, frames.length);\n return wrapFrames(frozenTemporal(current.type, current.milliseconds), frames);\n }\n const remaining = LIMITS.maxNodes - charge(nodes, frames.length);\n const json = cloneJsonWithStats(current, {\n ...LIMITS,\n maxDepth: remainingDepth(frames.length),\n maxNodes: remaining,\n });\n return wrapFrames(frozenJson(json.value), frames);\n}\n\nexport function decodeKaladaValue(input: unknown): KaladaValue {\n const frames: Frame[] = [];\n const active = new WeakSet<object>();\n let current = input;\n let nodes = 0;\n while (true) {\n nodes = charge(nodes, frames.length);\n const envelope = envelopeObject(current);\n if (active.has(envelope)) throw new TypeError(INVALID);\n active.add(envelope);\n const fields = envelopeFields(envelope);\n const temporal = decodeTemporal(envelope, fields);\n if (temporal) return wrapValues(temporal, frames);\n if (fields.type === \"Json\" && fields.variant === \"value\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n const value = decodeJson(dataValue(envelope, \"value\"), nodes, frames.length);\n return wrapValues(value, frames);\n }\n if (fields.type === \"Option\" && fields.variant === \"none\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\"]);\n return wrapValues(Option.none(), frames);\n }\n frames.push(payloadFrame(fields.type, fields.variant));\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n current = dataValue(envelope, \"value\");\n }\n}\n\nfunction decodeTemporal(\n envelope: object,\n fields: { type: unknown; variant: unknown },\n): InstantValue | DurationValue | undefined {\n if (fields.type !== \"Instant\" && fields.type !== \"Duration\") return undefined;\n if (fields.variant !== \"milliseconds\") throw new TypeError(INVALID);\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n const value = dataValue(envelope, \"value\");\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) throw new TypeError(INVALID);\n return fields.type === \"Instant\"\n ? Instant.fromMilliseconds(value)\n : Duration.fromMilliseconds(value);\n}\n\nfunction decodeJson(input: unknown, nodes: number, depth: number): JsonValue {\n return cloneJson(input, {\n ...LIMITS,\n maxDepth: remainingDepth(depth),\n maxNodes: LIMITS.maxNodes - nodes,\n });\n}\n\nfunction envelopeObject(input: unknown): object {\n if (typeof input !== \"object\" || input === null || Array.isArray(input))\n throw new TypeError(INVALID);\n try {\n const prototype = Object.getPrototypeOf(input);\n if (prototype !== Object.prototype && prototype !== null) throw new TypeError(INVALID);\n return input;\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction envelopeFields(input: object): { type: unknown; variant: unknown } {\n try {\n if (dataValue(input, \"format\") !== \"kalada-value\" || dataValue(input, \"version\") !== 1) {\n throw new TypeError(INVALID);\n }\n return { type: dataValue(input, \"type\"), variant: dataValue(input, \"variant\") };\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction payloadFrame(type: unknown, variant: unknown): Frame {\n if (type === \"Option\" && variant === \"some\") return { type, variant };\n if (type === \"Result\" && (variant === \"ok\" || variant === \"err\")) return { type, variant };\n throw new TypeError(INVALID);\n}\n\nfunction assertKeys(input: object, expected: readonly string[]): void {\n let keys: PropertyKey[];\n try {\n keys = Reflect.ownKeys(input);\n } catch {\n throw new TypeError(INVALID);\n }\n if (\n keys.length !== expected.length ||\n !keys.every((key) => typeof key === \"string\" && expected.includes(key))\n ) {\n throw new TypeError(INVALID);\n }\n}\n\nfunction wrapFrames(leaf: EncodedKaladaValueV1, frames: readonly Frame[]): EncodedKaladaValueV1 {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output = Object.freeze({ format: \"kalada-value\", version: 1, ...frame, value: output });\n }\n return output;\n}\n\nfunction wrapValues(leaf: KaladaValue, frames: readonly Frame[]): KaladaValue {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output =\n frame.type === \"Option\"\n ? Option.some(output)\n : frame.variant === \"ok\"\n ? Result.ok(output)\n : Result.err(output);\n }\n return output;\n}\n\nfunction charge(nodes: number, depth: number): number {\n if (depth > LIMITS.maxDepth || nodes >= LIMITS.maxNodes)\n throw new RangeError(\"Kalada value exceeds its limits.\");\n return nodes + 1;\n}\n\nfunction remainingDepth(depth: number): number {\n const remaining = LIMITS.maxDepth - depth;\n if (remaining < 0) throw new RangeError(\"Kalada value exceeds its limits.\");\n return remaining;\n}\n\nfunction frozenNone(): EncodedKaladaValueV1 {\n return Object.freeze({ format: \"kalada-value\", version: 1, type: \"Option\", variant: \"none\" });\n}\n\nfunction frozenJson(value: JsonValue): EncodedKaladaValueV1 {\n return Object.freeze({\n format: \"kalada-value\",\n version: 1,\n type: \"Json\",\n variant: \"value\",\n value,\n });\n}\n\nfunction frozenTemporal(type: \"Instant\" | \"Duration\", value: number): EncodedKaladaValueV1 {\n return Object.freeze({\n format: \"kalada-value\",\n version: 1,\n type,\n variant: \"milliseconds\",\n value,\n });\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { JsonValue } from './json.cjs';
2
2
  import { KaladaValue } from './values.cjs';
3
+ import './temporal.cjs';
3
4
 
4
5
  interface EncodedHeader {
5
6
  readonly format: "kalada-value";
@@ -20,6 +21,10 @@ type EncodedKaladaValueV1 = (EncodedHeader & {
20
21
  readonly type: "Result";
21
22
  readonly variant: "ok" | "err";
22
23
  readonly value: EncodedKaladaValueV1;
24
+ }) | (EncodedHeader & {
25
+ readonly type: "Instant" | "Duration";
26
+ readonly variant: "milliseconds";
27
+ readonly value: number;
23
28
  });
24
29
  declare function encodeKaladaValue(value: KaladaValue): EncodedKaladaValueV1;
25
30
  declare function decodeKaladaValue(input: unknown): KaladaValue;
@@ -1,5 +1,6 @@
1
1
  import { JsonValue } from './json.js';
2
2
  import { KaladaValue } from './values.js';
3
+ import './temporal.js';
3
4
 
4
5
  interface EncodedHeader {
5
6
  readonly format: "kalada-value";
@@ -20,6 +21,10 @@ type EncodedKaladaValueV1 = (EncodedHeader & {
20
21
  readonly type: "Result";
21
22
  readonly variant: "ok" | "err";
22
23
  readonly value: EncodedKaladaValueV1;
24
+ }) | (EncodedHeader & {
25
+ readonly type: "Instant" | "Duration";
26
+ readonly variant: "milliseconds";
27
+ readonly value: number;
23
28
  });
24
29
  declare function encodeKaladaValue(value: KaladaValue): EncodedKaladaValueV1;
25
30
  declare function decodeKaladaValue(input: unknown): KaladaValue;
@@ -1,5 +1,6 @@
1
1
  import { cloneJsonWithStats, dataValue, cloneJson } from './json.js';
2
2
  import { DEFAULT_KALADA_V1_LIMITS } from './limits.js';
3
+ import { isInstant, isDuration, Instant, Duration } from './temporal.js';
3
4
  import { isOption, isResult, Option, Result } from './values.js';
4
5
 
5
6
  const INVALID = "Invalid kalada-value v1 envelope.";
@@ -23,6 +24,10 @@ function encodeKaladaValue(value) {
23
24
  frames.push({ type: current.type, variant: current.variant });
24
25
  current = current.value;
25
26
  }
27
+ if (isInstant(current) || isDuration(current)) {
28
+ charge(nodes, frames.length);
29
+ return wrapFrames(frozenTemporal(current.type, current.milliseconds), frames);
30
+ }
26
31
  const remaining = LIMITS.maxNodes - charge(nodes, frames.length);
27
32
  const json = cloneJsonWithStats(current, {
28
33
  ...LIMITS,
@@ -42,6 +47,8 @@ function decodeKaladaValue(input) {
42
47
  if (active.has(envelope)) throw new TypeError(INVALID);
43
48
  active.add(envelope);
44
49
  const fields = envelopeFields(envelope);
50
+ const temporal = decodeTemporal(envelope, fields);
51
+ if (temporal) return wrapValues(temporal, frames);
45
52
  if (fields.type === "Json" && fields.variant === "value") {
46
53
  assertKeys(envelope, ["format", "version", "type", "variant", "value"]);
47
54
  const value = decodeJson(dataValue(envelope, "value"), nodes, frames.length);
@@ -56,6 +63,14 @@ function decodeKaladaValue(input) {
56
63
  current = dataValue(envelope, "value");
57
64
  }
58
65
  }
66
+ function decodeTemporal(envelope, fields) {
67
+ if (fields.type !== "Instant" && fields.type !== "Duration") return void 0;
68
+ if (fields.variant !== "milliseconds") throw new TypeError(INVALID);
69
+ assertKeys(envelope, ["format", "version", "type", "variant", "value"]);
70
+ const value = dataValue(envelope, "value");
71
+ if (typeof value !== "number" || !Number.isSafeInteger(value)) throw new TypeError(INVALID);
72
+ return fields.type === "Instant" ? Instant.fromMilliseconds(value) : Duration.fromMilliseconds(value);
73
+ }
59
74
  function decodeJson(input, nodes, depth) {
60
75
  return cloneJson(input, {
61
76
  ...LIMITS,
@@ -140,6 +155,15 @@ function frozenJson(value) {
140
155
  value
141
156
  });
142
157
  }
158
+ function frozenTemporal(type, value) {
159
+ return Object.freeze({
160
+ format: "kalada-value",
161
+ version: 1,
162
+ type,
163
+ variant: "milliseconds",
164
+ value
165
+ });
166
+ }
143
167
 
144
168
  export { decodeKaladaValue, encodeKaladaValue };
145
169
  //# sourceMappingURL=codec.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/codec.ts"],"names":[],"mappings":";;;;AAkCA,MAAM,OAAA,GAAU,mCAAA;AAChB,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO;AAAA,EAC3B,UAAU,wBAAA,CAAyB,aAAA;AAAA,EACnC,UAAU,wBAAA,CAAyB,aAAA;AAAA,EACnC,iBAAiB,wBAAA,CAAyB;AAC5C,CAAC,CAAA;AAEM,SAAS,kBAAkB,KAAA,EAA0C;AAC1E,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,MAAM,IAAA,uBAAW,OAAA,EAAgB;AACjC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,QAAA,CAAS,OAAO,CAAA,IAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC7C,IAAA,KAAA,GAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AACnC,IAAA,IAAI,KAAK,GAAA,CAAI,OAAO,GAAG,MAAM,IAAI,UAAU,OAAO,CAAA;AAClD,IAAA,IAAA,CAAK,IAAI,OAAO,CAAA;AAChB,IAAA,IAAI,QAAA,CAAS,OAAO,CAAA,IAAK,OAAA,CAAQ,YAAY,MAAA,EAAQ;AACnD,MAAA,OAAO,UAAA,CAAW,UAAA,EAAW,EAAG,MAAM,CAAA;AAAA,IACxC;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAM,OAAA,EAAS,OAAA,CAAQ,SAAkB,CAAA;AACrE,IAAA,OAAA,GAAU,OAAA,CAAQ,KAAA;AAAA,EACpB;AACA,EAAA,MAAM,YAAY,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAC/D,EAAA,MAAM,IAAA,GAAO,mBAAmB,OAAA,EAAS;AAAA,IACvC,GAAG,MAAA;AAAA,IACH,QAAA,EAAU,cAAA,CAAe,MAAA,CAAO,MAAM,CAAA;AAAA,IACtC,QAAA,EAAU;AAAA,GACX,CAAA;AACD,EAAA,OAAO,UAAA,CAAW,UAAA,CAAW,IAAA,CAAK,KAAK,GAAG,MAAM,CAAA;AAClD;AAEO,SAAS,kBAAkB,KAAA,EAA6B;AAC7D,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,MAAM,MAAA,uBAAa,OAAA,EAAgB;AACnC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,KAAA,GAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AACnC,IAAA,MAAM,QAAA,GAAW,eAAe,OAAO,CAAA;AACvC,IAAA,IAAI,OAAO,GAAA,CAAI,QAAQ,GAAG,MAAM,IAAI,UAAU,OAAO,CAAA;AACrD,IAAA,MAAA,CAAO,IAAI,QAAQ,CAAA;AACnB,IAAA,MAAM,MAAA,GAAS,eAAe,QAAQ,CAAA;AACtC,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,IAAU,MAAA,CAAO,YAAY,OAAA,EAAS;AACxD,MAAA,UAAA,CAAW,UAAU,CAAC,QAAA,EAAU,WAAW,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAC,CAAA;AACtE,MAAA,MAAM,KAAA,GAAQ,WAAW,SAAA,CAAU,QAAA,EAAU,OAAO,CAAA,EAAG,KAAA,EAAO,OAAO,MAAM,CAAA;AAC3E,MAAA,OAAO,UAAA,CAAW,OAAO,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,YAAY,MAAA,EAAQ;AACzD,MAAA,UAAA,CAAW,UAAU,CAAC,QAAA,EAAU,SAAA,EAAW,MAAA,EAAQ,SAAS,CAAC,CAAA;AAC7D,MAAA,OAAO,UAAA,CAAW,MAAA,CAAO,IAAA,EAAK,EAAG,MAAM,CAAA;AAAA,IACzC;AACA,IAAA,MAAA,CAAO,KAAK,YAAA,CAAa,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AACrD,IAAA,UAAA,CAAW,UAAU,CAAC,QAAA,EAAU,WAAW,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAC,CAAA;AACtE,IAAA,OAAA,GAAU,SAAA,CAAU,UAAU,OAAO,CAAA;AAAA,EACvC;AACF;AAEA,SAAS,UAAA,CAAW,KAAA,EAAgB,KAAA,EAAe,KAAA,EAA0B;AAC3E,EAAA,OAAO,UAAU,KAAA,EAAO;AAAA,IACtB,GAAG,MAAA;AAAA,IACH,QAAA,EAAU,eAAe,KAAK,CAAA;AAAA,IAC9B,QAAA,EAAU,OAAO,QAAA,GAAW;AAAA,GAC7B,CAAA;AACH;AAEA,SAAS,eAAe,KAAA,EAAwB;AAC9C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,KAAA,CAAM,QAAQ,KAAK,CAAA;AACpE,IAAA,MAAM,IAAI,UAAU,OAAO,CAAA;AAC7B,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA;AAC7C,IAAA,IAAI,SAAA,KAAc,OAAO,SAAA,IAAa,SAAA,KAAc,MAAM,MAAM,IAAI,UAAU,OAAO,CAAA;AACrF,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,UAAU,OAAO,CAAA;AAAA,EAC7B;AACF;AAEA,SAAS,eAAe,KAAA,EAAoD;AAC1E,EAAA,IAAI;AACF,IAAA,IAAI,SAAA,CAAU,OAAO,QAAQ,CAAA,KAAM,kBAAkB,SAAA,CAAU,KAAA,EAAO,SAAS,CAAA,KAAM,CAAA,EAAG;AACtF,MAAA,MAAM,IAAI,UAAU,OAAO,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,CAAU,KAAA,EAAO,MAAM,GAAG,OAAA,EAAS,SAAA,CAAU,KAAA,EAAO,SAAS,CAAA,EAAE;AAAA,EAChF,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,UAAU,OAAO,CAAA;AAAA,EAC7B;AACF;AAEA,SAAS,YAAA,CAAa,MAAe,OAAA,EAAyB;AAC5D,EAAA,IAAI,SAAS,QAAA,IAAY,OAAA,KAAY,QAAQ,OAAO,EAAE,MAAM,OAAA,EAAQ;AACpE,EAAA,IAAI,IAAA,KAAS,aAAa,OAAA,KAAY,IAAA,IAAQ,YAAY,KAAA,CAAA,EAAQ,OAAO,EAAE,IAAA,EAAM,OAAA,EAAQ;AACzF,EAAA,MAAM,IAAI,UAAU,OAAO,CAAA;AAC7B;AAEA,SAAS,UAAA,CAAW,OAAe,QAAA,EAAmC;AACpE,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,UAAU,OAAO,CAAA;AAAA,EAC7B;AACA,EAAA,IACE,KAAK,MAAA,KAAW,QAAA,CAAS,MAAA,IACzB,CAAC,KAAK,KAAA,CAAM,CAAC,GAAA,KAAQ,OAAO,QAAQ,QAAA,IAAY,QAAA,CAAS,QAAA,CAAS,GAAG,CAAC,CAAA,EACtE;AACA,IAAA,MAAM,IAAI,UAAU,OAAO,CAAA;AAAA,EAC7B;AACF;AAEA,SAAS,UAAA,CAAW,MAA4B,MAAA,EAAgD;AAC9F,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,KAAA,IAAS,QAAQ,MAAA,CAAO,MAAA,GAAS,GAAG,KAAA,IAAS,CAAA,EAAG,SAAS,CAAA,EAAG;AAC1D,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,UAAU,OAAO,CAAA;AACvC,IAAA,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,EAAE,MAAA,EAAQ,cAAA,EAAgB,OAAA,EAAS,CAAA,EAAG,GAAG,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,EACxF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAA,CAAW,MAAmB,MAAA,EAAuC;AAC5E,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,KAAA,IAAS,QAAQ,MAAA,CAAO,MAAA,GAAS,GAAG,KAAA,IAAS,CAAA,EAAG,SAAS,CAAA,EAAG;AAC1D,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,UAAU,OAAO,CAAA;AACvC,IAAA,MAAA,GACE,MAAM,IAAA,KAAS,QAAA,GACX,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,GAClB,KAAA,CAAM,OAAA,KAAY,IAAA,GAChB,OAAO,EAAA,CAAG,MAAM,CAAA,GAChB,MAAA,CAAO,IAAI,MAAM,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,MAAA,CAAO,OAAe,KAAA,EAAuB;AACpD,EAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,QAAA,IAAY,KAAA,IAAS,MAAA,CAAO,QAAA;AAC7C,IAAA,MAAM,IAAI,WAAW,kCAAkC,CAAA;AACzD,EAAA,OAAO,KAAA,GAAQ,CAAA;AACjB;AAEA,SAAS,eAAe,KAAA,EAAuB;AAC7C,EAAA,MAAM,SAAA,GAAY,OAAO,QAAA,GAAW,KAAA;AACpC,EAAA,IAAI,SAAA,GAAY,CAAA,EAAG,MAAM,IAAI,WAAW,kCAAkC,CAAA;AAC1E,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,UAAA,GAAmC;AAC1C,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,EAAE,MAAA,EAAQ,cAAA,EAAgB,OAAA,EAAS,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,CAAA;AAC9F;AAEA,SAAS,WAAW,KAAA,EAAwC;AAC1D,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,MAAA,EAAQ,cAAA;AAAA,IACR,OAAA,EAAS,CAAA;AAAA,IACT,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT;AAAA,GACD,CAAA;AACH","file":"codec.js","sourcesContent":["import { cloneJson, cloneJsonWithStats, dataValue, type JsonValue } from \"./json.js\";\nimport { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\nimport { isOption, isResult, type KaladaValue, Option, Result } from \"./values.js\";\n\ninterface EncodedHeader {\n readonly format: \"kalada-value\";\n readonly version: 1;\n}\n\nexport type EncodedKaladaValueV1 =\n | (EncodedHeader & {\n readonly type: \"Json\";\n readonly variant: \"value\";\n readonly value: JsonValue;\n })\n | (EncodedHeader & { readonly type: \"Option\"; readonly variant: \"none\" })\n | (EncodedHeader & {\n readonly type: \"Option\";\n readonly variant: \"some\";\n readonly value: EncodedKaladaValueV1;\n })\n | (EncodedHeader & {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n readonly value: EncodedKaladaValueV1;\n });\n\ntype Frame =\n | { readonly type: \"Option\"; readonly variant: \"some\" }\n | {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n };\n\nconst INVALID = \"Invalid kalada-value v1 envelope.\";\nconst LIMITS = Object.freeze({\n maxDepth: DEFAULT_KALADA_V1_LIMITS.maxValueDepth,\n maxNodes: DEFAULT_KALADA_V1_LIMITS.maxValueNodes,\n maxStringLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength,\n});\n\nexport function encodeKaladaValue(value: KaladaValue): EncodedKaladaValueV1 {\n const frames: Frame[] = [];\n const seen = new WeakSet<object>();\n let current = value;\n let nodes = 0;\n while (isOption(current) || isResult(current)) {\n nodes = charge(nodes, frames.length);\n if (seen.has(current)) throw new TypeError(INVALID);\n seen.add(current);\n if (isOption(current) && current.variant === \"none\") {\n return wrapFrames(frozenNone(), frames);\n }\n frames.push({ type: current.type, variant: current.variant } as Frame);\n current = current.value;\n }\n const remaining = LIMITS.maxNodes - charge(nodes, frames.length);\n const json = cloneJsonWithStats(current, {\n ...LIMITS,\n maxDepth: remainingDepth(frames.length),\n maxNodes: remaining,\n });\n return wrapFrames(frozenJson(json.value), frames);\n}\n\nexport function decodeKaladaValue(input: unknown): KaladaValue {\n const frames: Frame[] = [];\n const active = new WeakSet<object>();\n let current = input;\n let nodes = 0;\n while (true) {\n nodes = charge(nodes, frames.length);\n const envelope = envelopeObject(current);\n if (active.has(envelope)) throw new TypeError(INVALID);\n active.add(envelope);\n const fields = envelopeFields(envelope);\n if (fields.type === \"Json\" && fields.variant === \"value\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n const value = decodeJson(dataValue(envelope, \"value\"), nodes, frames.length);\n return wrapValues(value, frames);\n }\n if (fields.type === \"Option\" && fields.variant === \"none\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\"]);\n return wrapValues(Option.none(), frames);\n }\n frames.push(payloadFrame(fields.type, fields.variant));\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n current = dataValue(envelope, \"value\");\n }\n}\n\nfunction decodeJson(input: unknown, nodes: number, depth: number): JsonValue {\n return cloneJson(input, {\n ...LIMITS,\n maxDepth: remainingDepth(depth),\n maxNodes: LIMITS.maxNodes - nodes,\n });\n}\n\nfunction envelopeObject(input: unknown): object {\n if (typeof input !== \"object\" || input === null || Array.isArray(input))\n throw new TypeError(INVALID);\n try {\n const prototype = Object.getPrototypeOf(input);\n if (prototype !== Object.prototype && prototype !== null) throw new TypeError(INVALID);\n return input;\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction envelopeFields(input: object): { type: unknown; variant: unknown } {\n try {\n if (dataValue(input, \"format\") !== \"kalada-value\" || dataValue(input, \"version\") !== 1) {\n throw new TypeError(INVALID);\n }\n return { type: dataValue(input, \"type\"), variant: dataValue(input, \"variant\") };\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction payloadFrame(type: unknown, variant: unknown): Frame {\n if (type === \"Option\" && variant === \"some\") return { type, variant };\n if (type === \"Result\" && (variant === \"ok\" || variant === \"err\")) return { type, variant };\n throw new TypeError(INVALID);\n}\n\nfunction assertKeys(input: object, expected: readonly string[]): void {\n let keys: PropertyKey[];\n try {\n keys = Reflect.ownKeys(input);\n } catch {\n throw new TypeError(INVALID);\n }\n if (\n keys.length !== expected.length ||\n !keys.every((key) => typeof key === \"string\" && expected.includes(key))\n ) {\n throw new TypeError(INVALID);\n }\n}\n\nfunction wrapFrames(leaf: EncodedKaladaValueV1, frames: readonly Frame[]): EncodedKaladaValueV1 {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output = Object.freeze({ format: \"kalada-value\", version: 1, ...frame, value: output });\n }\n return output;\n}\n\nfunction wrapValues(leaf: KaladaValue, frames: readonly Frame[]): KaladaValue {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output =\n frame.type === \"Option\"\n ? Option.some(output)\n : frame.variant === \"ok\"\n ? Result.ok(output)\n : Result.err(output);\n }\n return output;\n}\n\nfunction charge(nodes: number, depth: number): number {\n if (depth > LIMITS.maxDepth || nodes >= LIMITS.maxNodes)\n throw new RangeError(\"Kalada value exceeds its limits.\");\n return nodes + 1;\n}\n\nfunction remainingDepth(depth: number): number {\n const remaining = LIMITS.maxDepth - depth;\n if (remaining < 0) throw new RangeError(\"Kalada value exceeds its limits.\");\n return remaining;\n}\n\nfunction frozenNone(): EncodedKaladaValueV1 {\n return Object.freeze({ format: \"kalada-value\", version: 1, type: \"Option\", variant: \"none\" });\n}\n\nfunction frozenJson(value: JsonValue): EncodedKaladaValueV1 {\n return Object.freeze({\n format: \"kalada-value\",\n version: 1,\n type: \"Json\",\n variant: \"value\",\n value,\n });\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/codec.ts"],"names":[],"mappings":"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","file":"codec.js","sourcesContent":["import { cloneJson, cloneJsonWithStats, dataValue, type JsonValue } from \"./json.js\";\nimport { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\nimport {\n Duration,\n type DurationValue,\n Instant,\n type InstantValue,\n isDuration,\n isInstant,\n} from \"./temporal.js\";\nimport { isOption, isResult, type KaladaValue, Option, Result } from \"./values.js\";\n\ninterface EncodedHeader {\n readonly format: \"kalada-value\";\n readonly version: 1;\n}\n\nexport type EncodedKaladaValueV1 =\n | (EncodedHeader & {\n readonly type: \"Json\";\n readonly variant: \"value\";\n readonly value: JsonValue;\n })\n | (EncodedHeader & { readonly type: \"Option\"; readonly variant: \"none\" })\n | (EncodedHeader & {\n readonly type: \"Option\";\n readonly variant: \"some\";\n readonly value: EncodedKaladaValueV1;\n })\n | (EncodedHeader & {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n readonly value: EncodedKaladaValueV1;\n })\n | (EncodedHeader & {\n readonly type: \"Instant\" | \"Duration\";\n readonly variant: \"milliseconds\";\n readonly value: number;\n });\n\ntype Frame =\n | { readonly type: \"Option\"; readonly variant: \"some\" }\n | {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n };\n\nconst INVALID = \"Invalid kalada-value v1 envelope.\";\nconst LIMITS = Object.freeze({\n maxDepth: DEFAULT_KALADA_V1_LIMITS.maxValueDepth,\n maxNodes: DEFAULT_KALADA_V1_LIMITS.maxValueNodes,\n maxStringLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength,\n});\n\nexport function encodeKaladaValue(value: KaladaValue): EncodedKaladaValueV1 {\n const frames: Frame[] = [];\n const seen = new WeakSet<object>();\n let current = value;\n let nodes = 0;\n while (isOption(current) || isResult(current)) {\n nodes = charge(nodes, frames.length);\n if (seen.has(current)) throw new TypeError(INVALID);\n seen.add(current);\n if (isOption(current) && current.variant === \"none\") {\n return wrapFrames(frozenNone(), frames);\n }\n frames.push({ type: current.type, variant: current.variant } as Frame);\n current = current.value;\n }\n if (isInstant(current) || isDuration(current)) {\n charge(nodes, frames.length);\n return wrapFrames(frozenTemporal(current.type, current.milliseconds), frames);\n }\n const remaining = LIMITS.maxNodes - charge(nodes, frames.length);\n const json = cloneJsonWithStats(current, {\n ...LIMITS,\n maxDepth: remainingDepth(frames.length),\n maxNodes: remaining,\n });\n return wrapFrames(frozenJson(json.value), frames);\n}\n\nexport function decodeKaladaValue(input: unknown): KaladaValue {\n const frames: Frame[] = [];\n const active = new WeakSet<object>();\n let current = input;\n let nodes = 0;\n while (true) {\n nodes = charge(nodes, frames.length);\n const envelope = envelopeObject(current);\n if (active.has(envelope)) throw new TypeError(INVALID);\n active.add(envelope);\n const fields = envelopeFields(envelope);\n const temporal = decodeTemporal(envelope, fields);\n if (temporal) return wrapValues(temporal, frames);\n if (fields.type === \"Json\" && fields.variant === \"value\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n const value = decodeJson(dataValue(envelope, \"value\"), nodes, frames.length);\n return wrapValues(value, frames);\n }\n if (fields.type === \"Option\" && fields.variant === \"none\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\"]);\n return wrapValues(Option.none(), frames);\n }\n frames.push(payloadFrame(fields.type, fields.variant));\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n current = dataValue(envelope, \"value\");\n }\n}\n\nfunction decodeTemporal(\n envelope: object,\n fields: { type: unknown; variant: unknown },\n): InstantValue | DurationValue | undefined {\n if (fields.type !== \"Instant\" && fields.type !== \"Duration\") return undefined;\n if (fields.variant !== \"milliseconds\") throw new TypeError(INVALID);\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n const value = dataValue(envelope, \"value\");\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) throw new TypeError(INVALID);\n return fields.type === \"Instant\"\n ? Instant.fromMilliseconds(value)\n : Duration.fromMilliseconds(value);\n}\n\nfunction decodeJson(input: unknown, nodes: number, depth: number): JsonValue {\n return cloneJson(input, {\n ...LIMITS,\n maxDepth: remainingDepth(depth),\n maxNodes: LIMITS.maxNodes - nodes,\n });\n}\n\nfunction envelopeObject(input: unknown): object {\n if (typeof input !== \"object\" || input === null || Array.isArray(input))\n throw new TypeError(INVALID);\n try {\n const prototype = Object.getPrototypeOf(input);\n if (prototype !== Object.prototype && prototype !== null) throw new TypeError(INVALID);\n return input;\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction envelopeFields(input: object): { type: unknown; variant: unknown } {\n try {\n if (dataValue(input, \"format\") !== \"kalada-value\" || dataValue(input, \"version\") !== 1) {\n throw new TypeError(INVALID);\n }\n return { type: dataValue(input, \"type\"), variant: dataValue(input, \"variant\") };\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction payloadFrame(type: unknown, variant: unknown): Frame {\n if (type === \"Option\" && variant === \"some\") return { type, variant };\n if (type === \"Result\" && (variant === \"ok\" || variant === \"err\")) return { type, variant };\n throw new TypeError(INVALID);\n}\n\nfunction assertKeys(input: object, expected: readonly string[]): void {\n let keys: PropertyKey[];\n try {\n keys = Reflect.ownKeys(input);\n } catch {\n throw new TypeError(INVALID);\n }\n if (\n keys.length !== expected.length ||\n !keys.every((key) => typeof key === \"string\" && expected.includes(key))\n ) {\n throw new TypeError(INVALID);\n }\n}\n\nfunction wrapFrames(leaf: EncodedKaladaValueV1, frames: readonly Frame[]): EncodedKaladaValueV1 {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output = Object.freeze({ format: \"kalada-value\", version: 1, ...frame, value: output });\n }\n return output;\n}\n\nfunction wrapValues(leaf: KaladaValue, frames: readonly Frame[]): KaladaValue {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output =\n frame.type === \"Option\"\n ? Option.some(output)\n : frame.variant === \"ok\"\n ? Result.ok(output)\n : Result.err(output);\n }\n return output;\n}\n\nfunction charge(nodes: number, depth: number): number {\n if (depth > LIMITS.maxDepth || nodes >= LIMITS.maxNodes)\n throw new RangeError(\"Kalada value exceeds its limits.\");\n return nodes + 1;\n}\n\nfunction remainingDepth(depth: number): number {\n const remaining = LIMITS.maxDepth - depth;\n if (remaining < 0) throw new RangeError(\"Kalada value exceeds its limits.\");\n return remaining;\n}\n\nfunction frozenNone(): EncodedKaladaValueV1 {\n return Object.freeze({ format: \"kalada-value\", version: 1, type: \"Option\", variant: \"none\" });\n}\n\nfunction frozenJson(value: JsonValue): EncodedKaladaValueV1 {\n return Object.freeze({\n format: \"kalada-value\",\n version: 1,\n type: \"Json\",\n variant: \"value\",\n value,\n });\n}\n\nfunction frozenTemporal(type: \"Instant\" | \"Duration\", value: number): EncodedKaladaValueV1 {\n return Object.freeze({\n format: \"kalada-value\",\n version: 1,\n type,\n variant: \"milliseconds\",\n value,\n });\n}\n"]}