@kalada/core 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +62 -3
  2. package/dist/kalada-v1/canonical-input.cjs.map +1 -1
  3. package/dist/kalada-v1/canonical-input.d.cts +3 -2
  4. package/dist/kalada-v1/canonical-input.d.ts +3 -2
  5. package/dist/kalada-v1/canonical-input.js.map +1 -1
  6. package/dist/kalada-v1/canonicalize.cjs +16 -1
  7. package/dist/kalada-v1/canonicalize.cjs.map +1 -1
  8. package/dist/kalada-v1/canonicalize.js +16 -1
  9. package/dist/kalada-v1/canonicalize.js.map +1 -1
  10. package/dist/kalada-v1/compile.cjs +13 -4
  11. package/dist/kalada-v1/compile.cjs.map +1 -1
  12. package/dist/kalada-v1/compile.js +14 -5
  13. package/dist/kalada-v1/compile.js.map +1 -1
  14. package/dist/kalada-v1/dependencies.cjs +49 -2
  15. package/dist/kalada-v1/dependencies.cjs.map +1 -1
  16. package/dist/kalada-v1/dependencies.js +49 -2
  17. package/dist/kalada-v1/dependencies.js.map +1 -1
  18. package/dist/kalada-v1/diagnostics.cjs +24 -4
  19. package/dist/kalada-v1/diagnostics.cjs.map +1 -1
  20. package/dist/kalada-v1/diagnostics.d.cts +4 -3
  21. package/dist/kalada-v1/diagnostics.d.ts +4 -3
  22. package/dist/kalada-v1/diagnostics.js +24 -4
  23. package/dist/kalada-v1/diagnostics.js.map +1 -1
  24. package/dist/kalada-v1/evaluate.cjs +10 -139
  25. package/dist/kalada-v1/evaluate.cjs.map +1 -1
  26. package/dist/kalada-v1/evaluate.d.cts +3 -2
  27. package/dist/kalada-v1/evaluate.d.ts +3 -2
  28. package/dist/kalada-v1/evaluate.js +12 -141
  29. package/dist/kalada-v1/evaluate.js.map +1 -1
  30. package/dist/kalada-v1/evaluation-delivery.cjs +286 -0
  31. package/dist/kalada-v1/evaluation-delivery.cjs.map +1 -0
  32. package/dist/kalada-v1/evaluation-delivery.d.cts +13 -0
  33. package/dist/kalada-v1/evaluation-delivery.d.ts +13 -0
  34. package/dist/kalada-v1/evaluation-delivery.js +284 -0
  35. package/dist/kalada-v1/evaluation-delivery.js.map +1 -0
  36. package/dist/kalada-v1/evaluation-frames.cjs +16 -0
  37. package/dist/kalada-v1/evaluation-frames.cjs.map +1 -0
  38. package/dist/kalada-v1/evaluation-frames.d.cts +83 -0
  39. package/dist/kalada-v1/evaluation-frames.d.ts +83 -0
  40. package/dist/kalada-v1/evaluation-frames.js +14 -0
  41. package/dist/kalada-v1/evaluation-frames.js.map +1 -0
  42. package/dist/kalada-v1/evaluation-machine.cjs +226 -0
  43. package/dist/kalada-v1/evaluation-machine.cjs.map +1 -0
  44. package/dist/kalada-v1/evaluation-machine.d.cts +9 -0
  45. package/dist/kalada-v1/evaluation-machine.d.ts +9 -0
  46. package/dist/kalada-v1/evaluation-machine.js +224 -0
  47. package/dist/kalada-v1/evaluation-machine.js.map +1 -0
  48. package/dist/kalada-v1/evaluation-resolution.cjs +80 -0
  49. package/dist/kalada-v1/evaluation-resolution.cjs.map +1 -0
  50. package/dist/kalada-v1/evaluation-resolution.d.cts +11 -0
  51. package/dist/kalada-v1/evaluation-resolution.d.ts +11 -0
  52. package/dist/kalada-v1/evaluation-resolution.js +78 -0
  53. package/dist/kalada-v1/evaluation-resolution.js.map +1 -0
  54. package/dist/kalada-v1/evaluation-state.cjs +94 -0
  55. package/dist/kalada-v1/evaluation-state.cjs.map +1 -0
  56. package/dist/kalada-v1/evaluation-state.d.cts +38 -0
  57. package/dist/kalada-v1/evaluation-state.d.ts +38 -0
  58. package/dist/kalada-v1/evaluation-state.js +81 -0
  59. package/dist/kalada-v1/evaluation-state.js.map +1 -0
  60. package/dist/kalada-v1/factories.cjs +28 -0
  61. package/dist/kalada-v1/factories.cjs.map +1 -1
  62. package/dist/kalada-v1/factories.d.cts +16 -1
  63. package/dist/kalada-v1/factories.d.ts +16 -1
  64. package/dist/kalada-v1/factories.js +28 -0
  65. package/dist/kalada-v1/factories.js.map +1 -1
  66. package/dist/kalada-v1/function-contracts.cjs +150 -0
  67. package/dist/kalada-v1/function-contracts.cjs.map +1 -0
  68. package/dist/kalada-v1/function-contracts.d.cts +15 -0
  69. package/dist/kalada-v1/function-contracts.d.ts +15 -0
  70. package/dist/kalada-v1/function-contracts.js +144 -0
  71. package/dist/kalada-v1/function-contracts.js.map +1 -0
  72. package/dist/kalada-v1/index.cjs +13 -0
  73. package/dist/kalada-v1/index.d.cts +4 -3
  74. package/dist/kalada-v1/index.d.ts +4 -3
  75. package/dist/kalada-v1/index.js +3 -2
  76. package/dist/kalada-v1/limits.cjs +23 -2
  77. package/dist/kalada-v1/limits.cjs.map +1 -1
  78. package/dist/kalada-v1/limits.d.cts +5 -3
  79. package/dist/kalada-v1/limits.d.ts +5 -3
  80. package/dist/kalada-v1/limits.js +23 -3
  81. package/dist/kalada-v1/limits.js.map +1 -1
  82. package/dist/kalada-v1/runtime-values.cjs +112 -0
  83. package/dist/kalada-v1/runtime-values.cjs.map +1 -0
  84. package/dist/kalada-v1/runtime-values.d.cts +35 -0
  85. package/dist/kalada-v1/runtime-values.d.ts +35 -0
  86. package/dist/kalada-v1/runtime-values.js +105 -0
  87. package/dist/kalada-v1/runtime-values.js.map +1 -0
  88. package/dist/kalada-v1/schemas.cjs +107 -2
  89. package/dist/kalada-v1/schemas.cjs.map +1 -1
  90. package/dist/kalada-v1/schemas.d.cts +2 -1
  91. package/dist/kalada-v1/schemas.d.ts +2 -1
  92. package/dist/kalada-v1/schemas.js +108 -4
  93. package/dist/kalada-v1/schemas.js.map +1 -1
  94. package/dist/kalada-v1/static-analysis.cjs +177 -0
  95. package/dist/kalada-v1/static-analysis.cjs.map +1 -0
  96. package/dist/kalada-v1/static-analysis.d.cts +9 -0
  97. package/dist/kalada-v1/static-analysis.d.ts +9 -0
  98. package/dist/kalada-v1/static-analysis.js +175 -0
  99. package/dist/kalada-v1/static-analysis.js.map +1 -0
  100. package/dist/kalada-v1/static-types.cjs +229 -0
  101. package/dist/kalada-v1/static-types.cjs.map +1 -0
  102. package/dist/kalada-v1/static-types.d.cts +8 -0
  103. package/dist/kalada-v1/static-types.d.ts +8 -0
  104. package/dist/kalada-v1/static-types.js +227 -0
  105. package/dist/kalada-v1/static-types.js.map +1 -0
  106. package/dist/kalada-v1/temporal-evaluation.cjs +21 -0
  107. package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -1
  108. package/dist/kalada-v1/temporal-evaluation.d.cts +7 -2
  109. package/dist/kalada-v1/temporal-evaluation.d.ts +7 -2
  110. package/dist/kalada-v1/temporal-evaluation.js +20 -1
  111. package/dist/kalada-v1/temporal-evaluation.js.map +1 -1
  112. package/dist/kalada-v1/types.d.cts +78 -4
  113. package/dist/kalada-v1/types.d.ts +78 -4
  114. package/package.json +1 -1
@@ -0,0 +1,144 @@
1
+ import { exact, count, properties, bindingName, strictArray } from './canonical-input.js';
2
+ import { KaladaFailure } from './diagnostics.js';
3
+
4
+ const TYPE_KEYS = /* @__PURE__ */ new Set([
5
+ "kind",
6
+ "name",
7
+ "value",
8
+ "ok",
9
+ "error",
10
+ "element",
11
+ "parameters",
12
+ "returns"
13
+ ]);
14
+ const PRIMITIVES = /* @__PURE__ */ new Set(["null", "boolean", "number", "string", "json", "Instant", "Duration"]);
15
+ function canonicalFunction(raw, path, depth, state, read) {
16
+ exact(raw, path, ["kind", "parameters", "returns", "body"]);
17
+ const parameters = canonicalParameters(raw.parameters, [...path, "parameters"], depth + 1, state);
18
+ const returns = canonicalType(raw.returns, [...path, "returns"], depth + 1, state);
19
+ const body = read(raw.body, [...path, "body"], depth + 1, state);
20
+ return Object.freeze({ kind: "function", parameters, returns, body });
21
+ }
22
+ function canonicalCall(raw, path, depth, state, read) {
23
+ exact(raw, path, ["kind", "callee", "arguments"]);
24
+ const callee = read(raw.callee, [...path, "callee"], depth + 1, state);
25
+ const args = array(raw.arguments, [...path, "arguments"]);
26
+ const output = args.map(
27
+ (item, index) => read(item, [...path, "arguments", index], depth + 1, state)
28
+ );
29
+ return Object.freeze({ kind: "call", callee, arguments: Object.freeze(output) });
30
+ }
31
+ function canonicalGroup(raw, path, depth, state, read) {
32
+ exact(raw, path, ["kind", "functions", "body"]);
33
+ const entries = array(raw.functions, [...path, "functions"]);
34
+ if (entries.length > state.limits.maxFunctionGroupSize) limit([...path, "functions"]);
35
+ const names = /* @__PURE__ */ new Set();
36
+ const functions = entries.map((item, index) => {
37
+ const member = canonicalMember(item, [...path, "functions", index], depth + 1, state, read);
38
+ if (names.has(member.name)) duplicate([...path, "functions", index, "name"]);
39
+ names.add(member.name);
40
+ return member;
41
+ });
42
+ const body = read(raw.body, [...path, "body"], depth + 1, state);
43
+ return Object.freeze({ kind: "function-group", functions: Object.freeze(functions), body });
44
+ }
45
+ function canonicalCoreFunction(raw, path) {
46
+ exact(raw, path, ["kind", "name"]);
47
+ if (raw.name !== "map" && raw.name !== "filter" && raw.name !== "some" && raw.name !== "every") {
48
+ throw new KaladaFailure("KALADA_INVALID_INPUT", [...path, "name"]);
49
+ }
50
+ return Object.freeze({ kind: "core-function", name: raw.name });
51
+ }
52
+ function canonicalType(input, path, depth, state) {
53
+ count(path, depth, state);
54
+ if (typeof input !== "object" || input === null || state.active.has(input)) {
55
+ throw new KaladaFailure("KALADA_INVALID_FUNCTION_TYPE", path);
56
+ }
57
+ state.active.add(input);
58
+ try {
59
+ const raw = properties(input, path, TYPE_KEYS, false);
60
+ if (raw.kind === "primitive-type") return primitiveType(raw, path);
61
+ if (raw.kind === "option-type")
62
+ return unaryType(raw, path, depth, state, "option-type", "value");
63
+ if (raw.kind === "array-type")
64
+ return unaryType(raw, path, depth, state, "array-type", "element");
65
+ if (raw.kind === "result-type") return resultType(raw, path, depth, state);
66
+ if (raw.kind === "function-type") return functionType(raw, path, depth, state);
67
+ throw new KaladaFailure("KALADA_INVALID_FUNCTION_TYPE", [...path, "kind"]);
68
+ } finally {
69
+ state.active.delete(input);
70
+ }
71
+ }
72
+ function canonicalMember(input, path, depth, state, read) {
73
+ count(path, depth, state);
74
+ const raw = properties(input, path, /* @__PURE__ */ new Set(["name", "parameters", "returns", "body"]));
75
+ const name = bindingName(raw.name, [...path, "name"], state.limits);
76
+ const parameters = canonicalParameters(raw.parameters, [...path, "parameters"], depth + 1, state);
77
+ const returns = canonicalType(raw.returns, [...path, "returns"], depth + 1, state);
78
+ const body = read(raw.body, [...path, "body"], depth + 1, state);
79
+ return Object.freeze({ name, parameters, returns, body });
80
+ }
81
+ function canonicalParameters(input, path, depth, state) {
82
+ const entries = array(input, path);
83
+ if (entries.length > state.limits.maxFunctionParameters) limit(path);
84
+ const names = /* @__PURE__ */ new Set();
85
+ const output = entries.map((item, index) => {
86
+ const itemPath = [...path, index];
87
+ count(itemPath, depth, state);
88
+ const raw = properties(item, itemPath, /* @__PURE__ */ new Set(["name", "type"]));
89
+ const name = bindingName(raw.name, [...itemPath, "name"], state.limits);
90
+ if (names.has(name)) duplicate([...itemPath, "name"]);
91
+ names.add(name);
92
+ return Object.freeze({
93
+ name,
94
+ type: canonicalType(raw.type, [...itemPath, "type"], depth + 1, state)
95
+ });
96
+ });
97
+ return Object.freeze(output);
98
+ }
99
+ function functionType(raw, path, depth, state) {
100
+ exact(raw, path, ["kind", "parameters", "returns"]);
101
+ const entries = array(raw.parameters, [...path, "parameters"]);
102
+ if (entries.length > state.limits.maxFunctionParameters) limit([...path, "parameters"]);
103
+ const parameters = entries.map(
104
+ (item, index) => canonicalType(item, [...path, "parameters", index], depth + 1, state)
105
+ );
106
+ const returns = canonicalType(raw.returns, [...path, "returns"], depth + 1, state);
107
+ return Object.freeze({ kind: "function-type", parameters: Object.freeze(parameters), returns });
108
+ }
109
+ function primitiveType(raw, path) {
110
+ exact(raw, path, ["kind", "name"]);
111
+ if (typeof raw.name !== "string" || !PRIMITIVES.has(raw.name)) {
112
+ throw new KaladaFailure("KALADA_INVALID_FUNCTION_TYPE", [...path, "name"]);
113
+ }
114
+ return Object.freeze({ kind: "primitive-type", name: raw.name });
115
+ }
116
+ function unaryType(raw, path, depth, state, kind, key) {
117
+ exact(raw, path, ["kind", key]);
118
+ return Object.freeze({
119
+ kind,
120
+ [key]: canonicalType(raw[key], [...path, key], depth + 1, state)
121
+ });
122
+ }
123
+ function resultType(raw, path, depth, state) {
124
+ exact(raw, path, ["kind", "ok", "error"]);
125
+ return Object.freeze({
126
+ kind: "result-type",
127
+ ok: canonicalType(raw.ok, [...path, "ok"], depth + 1, state),
128
+ error: canonicalType(raw.error, [...path, "error"], depth + 1, state)
129
+ });
130
+ }
131
+ function array(input, path) {
132
+ if (!Array.isArray(input)) throw new KaladaFailure("KALADA_INVALID_INPUT", path);
133
+ return strictArray(input, path);
134
+ }
135
+ function limit(path) {
136
+ throw new KaladaFailure("KALADA_LIMIT_EXCEEDED", path);
137
+ }
138
+ function duplicate(path) {
139
+ throw new KaladaFailure("KALADA_DUPLICATE_BINDING", path);
140
+ }
141
+
142
+ export { canonicalCall, canonicalCoreFunction, canonicalFunction, canonicalGroup, canonicalType };
143
+ //# sourceMappingURL=function-contracts.js.map
144
+ //# sourceMappingURL=function-contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/function-contracts.ts"],"names":[],"mappings":"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","file":"function-contracts.js","sourcesContent":["import {\n bindingName,\n type CanonicalState,\n count,\n exact,\n type Path,\n properties,\n strictArray,\n} from \"./canonical-input.js\";\nimport { KaladaFailure } from \"./diagnostics.js\";\nimport type { JsonValue } from \"./json.js\";\nimport type {\n CallExpression,\n CoreFunctionExpression,\n FunctionExpression,\n FunctionGroupExpression,\n KaladaFunctionParameter,\n KaladaType,\n KaladaV1Expression,\n NamedFunction,\n} from \"./types.js\";\n\ntype NodeReader<R extends JsonValue> = (\n input: unknown,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n) => KaladaV1Expression<R>;\n\nconst TYPE_KEYS = new Set([\n \"kind\",\n \"name\",\n \"value\",\n \"ok\",\n \"error\",\n \"element\",\n \"parameters\",\n \"returns\",\n]);\nconst PRIMITIVES = new Set([\"null\", \"boolean\", \"number\", \"string\", \"json\", \"Instant\", \"Duration\"]);\n\nexport function canonicalFunction<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n read: NodeReader<R>,\n): FunctionExpression<R> {\n exact(raw, path, [\"kind\", \"parameters\", \"returns\", \"body\"]);\n const parameters = canonicalParameters(raw.parameters, [...path, \"parameters\"], depth + 1, state);\n const returns = canonicalType(raw.returns, [...path, \"returns\"], depth + 1, state);\n const body = read(raw.body, [...path, \"body\"], depth + 1, state);\n return Object.freeze({ kind: \"function\", parameters, returns, body });\n}\n\nexport function canonicalCall<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n read: NodeReader<R>,\n): CallExpression<R> {\n exact(raw, path, [\"kind\", \"callee\", \"arguments\"]);\n const callee = read(raw.callee, [...path, \"callee\"], depth + 1, state);\n const args = array(raw.arguments, [...path, \"arguments\"]);\n const output = args.map((item, index) =>\n read(item, [...path, \"arguments\", index], depth + 1, state),\n );\n return Object.freeze({ kind: \"call\", callee, arguments: Object.freeze(output) });\n}\n\nexport function canonicalGroup<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n read: NodeReader<R>,\n): FunctionGroupExpression<R> {\n exact(raw, path, [\"kind\", \"functions\", \"body\"]);\n const entries = array(raw.functions, [...path, \"functions\"]);\n if (entries.length > state.limits.maxFunctionGroupSize) limit([...path, \"functions\"]);\n const names = new Set<string>();\n const functions = entries.map((item, index) => {\n const member = canonicalMember(item, [...path, \"functions\", index], depth + 1, state, read);\n if (names.has(member.name)) duplicate([...path, \"functions\", index, \"name\"]);\n names.add(member.name);\n return member;\n });\n const body = read(raw.body, [...path, \"body\"], depth + 1, state);\n return Object.freeze({ kind: \"function-group\", functions: Object.freeze(functions), body });\n}\n\nexport function canonicalCoreFunction(\n raw: Record<string, unknown>,\n path: Path,\n): CoreFunctionExpression {\n exact(raw, path, [\"kind\", \"name\"]);\n if (raw.name !== \"map\" && raw.name !== \"filter\" && raw.name !== \"some\" && raw.name !== \"every\") {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"name\"]);\n }\n return Object.freeze({ kind: \"core-function\", name: raw.name });\n}\n\nexport function canonicalType<R extends JsonValue>(\n input: unknown,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n): KaladaType {\n count(path, depth, state);\n if (typeof input !== \"object\" || input === null || state.active.has(input)) {\n throw new KaladaFailure(\"KALADA_INVALID_FUNCTION_TYPE\", path);\n }\n state.active.add(input);\n try {\n const raw = properties(input, path, TYPE_KEYS, false);\n if (raw.kind === \"primitive-type\") return primitiveType(raw, path);\n if (raw.kind === \"option-type\")\n return unaryType(raw, path, depth, state, \"option-type\", \"value\");\n if (raw.kind === \"array-type\")\n return unaryType(raw, path, depth, state, \"array-type\", \"element\");\n if (raw.kind === \"result-type\") return resultType(raw, path, depth, state);\n if (raw.kind === \"function-type\") return functionType(raw, path, depth, state);\n throw new KaladaFailure(\"KALADA_INVALID_FUNCTION_TYPE\", [...path, \"kind\"]);\n } finally {\n state.active.delete(input);\n }\n}\n\nfunction canonicalMember<R extends JsonValue>(\n input: unknown,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n read: NodeReader<R>,\n): NamedFunction<R> {\n count(path, depth, state);\n const raw = properties(input, path, new Set([\"name\", \"parameters\", \"returns\", \"body\"]));\n const name = bindingName(raw.name, [...path, \"name\"], state.limits);\n const parameters = canonicalParameters(raw.parameters, [...path, \"parameters\"], depth + 1, state);\n const returns = canonicalType(raw.returns, [...path, \"returns\"], depth + 1, state);\n const body = read(raw.body, [...path, \"body\"], depth + 1, state);\n return Object.freeze({ name, parameters, returns, body });\n}\n\nfunction canonicalParameters<R extends JsonValue>(\n input: unknown,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n): readonly KaladaFunctionParameter[] {\n const entries = array(input, path);\n if (entries.length > state.limits.maxFunctionParameters) limit(path);\n const names = new Set<string>();\n const output = entries.map((item, index) => {\n const itemPath = [...path, index];\n count(itemPath, depth, state);\n const raw = properties(item, itemPath, new Set([\"name\", \"type\"]));\n const name = bindingName(raw.name, [...itemPath, \"name\"], state.limits);\n if (names.has(name)) duplicate([...itemPath, \"name\"]);\n names.add(name);\n return Object.freeze({\n name,\n type: canonicalType(raw.type, [...itemPath, \"type\"], depth + 1, state),\n });\n });\n return Object.freeze(output);\n}\n\nfunction functionType<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n): KaladaType {\n exact(raw, path, [\"kind\", \"parameters\", \"returns\"]);\n const entries = array(raw.parameters, [...path, \"parameters\"]);\n if (entries.length > state.limits.maxFunctionParameters) limit([...path, \"parameters\"]);\n const parameters = entries.map((item, index) =>\n canonicalType(item, [...path, \"parameters\", index], depth + 1, state),\n );\n const returns = canonicalType(raw.returns, [...path, \"returns\"], depth + 1, state);\n return Object.freeze({ kind: \"function-type\", parameters: Object.freeze(parameters), returns });\n}\n\nfunction primitiveType(raw: Record<string, unknown>, path: Path): KaladaType {\n exact(raw, path, [\"kind\", \"name\"]);\n if (typeof raw.name !== \"string\" || !PRIMITIVES.has(raw.name)) {\n throw new KaladaFailure(\"KALADA_INVALID_FUNCTION_TYPE\", [...path, \"name\"]);\n }\n return Object.freeze({ kind: \"primitive-type\", name: raw.name }) as KaladaType;\n}\n\nfunction unaryType<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n kind: \"option-type\" | \"array-type\",\n key: \"value\" | \"element\",\n): KaladaType {\n exact(raw, path, [\"kind\", key]);\n return Object.freeze({\n kind,\n [key]: canonicalType(raw[key], [...path, key], depth + 1, state),\n }) as KaladaType;\n}\n\nfunction resultType<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n): KaladaType {\n exact(raw, path, [\"kind\", \"ok\", \"error\"]);\n return Object.freeze({\n kind: \"result-type\",\n ok: canonicalType(raw.ok, [...path, \"ok\"], depth + 1, state),\n error: canonicalType(raw.error, [...path, \"error\"], depth + 1, state),\n });\n}\n\nfunction array(input: unknown, path: Path): unknown[] {\n if (!Array.isArray(input)) throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n return strictArray(input, path);\n}\n\nfunction limit(path: Path): never {\n throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n}\nfunction duplicate(path: Path): never {\n throw new KaladaFailure(\"KALADA_DUPLICATE_BINDING\", path);\n}\n"]}
@@ -7,6 +7,7 @@ var dependencies_js = require('./dependencies.js');
7
7
  var factories_js = require('./factories.js');
8
8
  var limits_js = require('./limits.js');
9
9
  var schemas_js = require('./schemas.js');
10
+ var staticAnalysis_js = require('./static-analysis.js');
10
11
  var temporal_js = require('./temporal.js');
11
12
  var values_js = require('./values.js');
12
13
 
@@ -36,10 +37,18 @@ Object.defineProperty(exports, "KaladaV1", {
36
37
  enumerable: true,
37
38
  get: function () { return factories_js.KaladaV1; }
38
39
  });
40
+ Object.defineProperty(exports, "DEFAULT_KALADA_V1_FUNCTION_LIMITS", {
41
+ enumerable: true,
42
+ get: function () { return limits_js.DEFAULT_KALADA_V1_FUNCTION_LIMITS; }
43
+ });
39
44
  Object.defineProperty(exports, "DEFAULT_KALADA_V1_LIMITS", {
40
45
  enumerable: true,
41
46
  get: function () { return limits_js.DEFAULT_KALADA_V1_LIMITS; }
42
47
  });
48
+ Object.defineProperty(exports, "KALADA_V1_FUNCTION_PROGRAM_SCHEMA", {
49
+ enumerable: true,
50
+ get: function () { return schemas_js.KALADA_V1_FUNCTION_PROGRAM_SCHEMA; }
51
+ });
43
52
  Object.defineProperty(exports, "KALADA_V1_PROGRAM_SCHEMA", {
44
53
  enumerable: true,
45
54
  get: function () { return schemas_js.KALADA_V1_PROGRAM_SCHEMA; }
@@ -48,6 +57,10 @@ Object.defineProperty(exports, "KALADA_VALUE_V1_SCHEMA", {
48
57
  enumerable: true,
49
58
  get: function () { return schemas_js.KALADA_VALUE_V1_SCHEMA; }
50
59
  });
60
+ Object.defineProperty(exports, "analyzeKaladaV1Functions", {
61
+ enumerable: true,
62
+ get: function () { return staticAnalysis_js.analyzeKaladaV1Functions; }
63
+ });
51
64
  Object.defineProperty(exports, "Duration", {
52
65
  enumerable: true,
53
66
  get: function () { return temporal_js.Duration; }
@@ -4,8 +4,9 @@ export { compileKaladaV1Program } from './compile.cjs';
4
4
  export { collectKaladaV1Dependencies } from './dependencies.cjs';
5
5
  export { KaladaV1 } from './factories.cjs';
6
6
  export { JsonPrimitive, JsonValue } from './json.cjs';
7
- export { DEFAULT_KALADA_V1_LIMITS } from './limits.cjs';
8
- export { KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA, KaladaV1JsonSchema } from './schemas.cjs';
7
+ export { DEFAULT_KALADA_V1_FUNCTION_LIMITS, DEFAULT_KALADA_V1_LIMITS } from './limits.cjs';
8
+ export { KALADA_V1_FUNCTION_PROGRAM_SCHEMA, KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA, KaladaV1JsonSchema } from './schemas.cjs';
9
+ export { analyzeKaladaV1Functions } from './static-analysis.cjs';
9
10
  export { Duration, DurationValue, Instant, InstantValue, isDuration, isInstant } from './temporal.cjs';
10
- export { BindingExpression, CompiledKaladaV1Program, CurrentInstantExpression, DurationExpression, InstantExpression, KaladaV1Clock, KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1EvaluationInputs, KaladaV1Expression, KaladaV1Limits, KaladaV1Options, KaladaV1Outcome, KaladaV1Program, KaladaV1ReferenceCodec, KaladaV1Resolution, KaladaV1Resolver, MatchArm, MatchExpression, OptionExpression, ResultExpression, TemporalArithmeticExpression, TemporalComparisonExpression } from './types.cjs';
11
+ export { BindingExpression, CallExpression, CompiledKaladaV1Program, CoreFunctionExpression, CurrentInstantExpression, DurationExpression, FunctionExpression, FunctionGroupExpression, InstantExpression, KaladaCoreFunctionName, KaladaFunctionParameter, KaladaFunctionType, KaladaPrimitiveTypeName, KaladaType, KaladaV1Clock, KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1DiagnosticContextFrame, KaladaV1EvaluationInputs, KaladaV1Expression, KaladaV1FunctionCapture, KaladaV1FunctionLimits, KaladaV1Limits, KaladaV1Options, KaladaV1Outcome, KaladaV1Program, KaladaV1ReferenceCodec, KaladaV1Resolution, KaladaV1Resolver, MatchArm, MatchExpression, NamedFunction, OptionExpression, ResultExpression, TemporalArithmeticExpression, TemporalComparisonExpression } from './types.cjs';
11
12
  export { ErrValue, KaladaValue, NoneValue, OkValue, Option, OptionValue, Result, ResultValue, SomeValue, equalKaladaValues, isOption, isResult } from './values.cjs';
@@ -4,8 +4,9 @@ export { compileKaladaV1Program } from './compile.js';
4
4
  export { collectKaladaV1Dependencies } from './dependencies.js';
5
5
  export { KaladaV1 } from './factories.js';
6
6
  export { JsonPrimitive, JsonValue } from './json.js';
7
- export { DEFAULT_KALADA_V1_LIMITS } from './limits.js';
8
- export { KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA, KaladaV1JsonSchema } from './schemas.js';
7
+ export { DEFAULT_KALADA_V1_FUNCTION_LIMITS, DEFAULT_KALADA_V1_LIMITS } from './limits.js';
8
+ export { KALADA_V1_FUNCTION_PROGRAM_SCHEMA, KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA, KaladaV1JsonSchema } from './schemas.js';
9
+ export { analyzeKaladaV1Functions } from './static-analysis.js';
9
10
  export { Duration, DurationValue, Instant, InstantValue, isDuration, isInstant } from './temporal.js';
10
- export { BindingExpression, CompiledKaladaV1Program, CurrentInstantExpression, DurationExpression, InstantExpression, KaladaV1Clock, KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1EvaluationInputs, KaladaV1Expression, KaladaV1Limits, KaladaV1Options, KaladaV1Outcome, KaladaV1Program, KaladaV1ReferenceCodec, KaladaV1Resolution, KaladaV1Resolver, MatchArm, MatchExpression, OptionExpression, ResultExpression, TemporalArithmeticExpression, TemporalComparisonExpression } from './types.js';
11
+ export { BindingExpression, CallExpression, CompiledKaladaV1Program, CoreFunctionExpression, CurrentInstantExpression, DurationExpression, FunctionExpression, FunctionGroupExpression, InstantExpression, KaladaCoreFunctionName, KaladaFunctionParameter, KaladaFunctionType, KaladaPrimitiveTypeName, KaladaType, KaladaV1Clock, KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1DiagnosticContextFrame, KaladaV1EvaluationInputs, KaladaV1Expression, KaladaV1FunctionCapture, KaladaV1FunctionLimits, KaladaV1Limits, KaladaV1Options, KaladaV1Outcome, KaladaV1Program, KaladaV1ReferenceCodec, KaladaV1Resolution, KaladaV1Resolver, MatchArm, MatchExpression, NamedFunction, OptionExpression, ResultExpression, TemporalArithmeticExpression, TemporalComparisonExpression } from './types.js';
11
12
  export { ErrValue, KaladaValue, NoneValue, OkValue, Option, OptionValue, Result, ResultValue, SomeValue, equalKaladaValues, isOption, isResult } from './values.js';
@@ -3,8 +3,9 @@ export { decodeKaladaValue, encodeKaladaValue } from './codec.js';
3
3
  export { compileKaladaV1Program } from './compile.js';
4
4
  export { collectKaladaV1Dependencies } from './dependencies.js';
5
5
  export { KaladaV1 } from './factories.js';
6
- export { DEFAULT_KALADA_V1_LIMITS } from './limits.js';
7
- export { KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA } from './schemas.js';
6
+ export { DEFAULT_KALADA_V1_FUNCTION_LIMITS, DEFAULT_KALADA_V1_LIMITS } from './limits.js';
7
+ export { KALADA_V1_FUNCTION_PROGRAM_SCHEMA, KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA } from './schemas.js';
8
+ export { analyzeKaladaV1Functions } from './static-analysis.js';
8
9
  export { Duration, Instant, isDuration, isInstant } from './temporal.js';
9
10
  export { Option, Result, equalKaladaValues, isOption, isResult } from './values.js';
10
11
  //# sourceMappingURL=index.js.map
@@ -9,6 +9,17 @@ const DEFAULT_KALADA_V1_LIMITS = Object.freeze({
9
9
  maxReferenceLength: 1e3,
10
10
  maxEvaluationSteps: 1e4
11
11
  });
12
+ const DEFAULT_KALADA_V1_FUNCTION_LIMITS = Object.freeze({
13
+ maxFunctionParameters: 32,
14
+ maxFunctionGroupSize: 64,
15
+ maxCapturesPerClosure: 64,
16
+ maxCapturedBindings: 1e3,
17
+ maxClosures: 1e3,
18
+ maxCallDepth: 256,
19
+ maxContinuationFrames: 1e3,
20
+ maxCollectionLength: 1e4,
21
+ maxCollectionIterations: 1e4
22
+ });
12
23
  const MAXIMUM = Object.freeze({
13
24
  maxAstDepth: 256,
14
25
  maxAstNodes: 1e5,
@@ -16,10 +27,19 @@ const MAXIMUM = Object.freeze({
16
27
  maxValueNodes: 1e5,
17
28
  maxStringLength: 1e6,
18
29
  maxReferenceLength: 1e5,
19
- maxEvaluationSteps: 1e5
30
+ maxEvaluationSteps: 1e5,
31
+ maxFunctionParameters: 256,
32
+ maxFunctionGroupSize: 1024,
33
+ maxCapturesPerClosure: 256,
34
+ maxCapturedBindings: 1e5,
35
+ maxClosures: 1e5,
36
+ maxCallDepth: 4096,
37
+ maxContinuationFrames: 1e5,
38
+ maxCollectionLength: 1e5,
39
+ maxCollectionIterations: 1e5
20
40
  });
21
41
  function resolveLimits(input) {
22
- const limits = { ...DEFAULT_KALADA_V1_LIMITS, ...input };
42
+ const limits = { ...DEFAULT_KALADA_V1_LIMITS, ...DEFAULT_KALADA_V1_FUNCTION_LIMITS, ...input };
23
43
  for (const key of Object.keys(limits)) {
24
44
  const value = limits[key];
25
45
  if (!Number.isSafeInteger(value) || value < 1 || value > MAXIMUM[key])
@@ -28,6 +48,7 @@ function resolveLimits(input) {
28
48
  return Object.freeze(limits);
29
49
  }
30
50
 
51
+ exports.DEFAULT_KALADA_V1_FUNCTION_LIMITS = DEFAULT_KALADA_V1_FUNCTION_LIMITS;
31
52
  exports.DEFAULT_KALADA_V1_LIMITS = DEFAULT_KALADA_V1_LIMITS;
32
53
  exports.resolveLimits = resolveLimits;
33
54
  //# sourceMappingURL=limits.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/limits.ts"],"names":[],"mappings":";;AAEO,MAAM,wBAAA,GAA2C,OAAO,MAAA,CAAO;AAAA,EACpE,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa,GAAA;AAAA,EACb,aAAA,EAAe,EAAA;AAAA,EACf,aAAA,EAAe,GAAA;AAAA,EACf,eAAA,EAAiB,GAAA;AAAA,EACjB,kBAAA,EAAoB,GAAA;AAAA,EACpB,kBAAA,EAAoB;AACtB,CAAC;AAED,MAAM,OAAA,GAA0B,OAAO,MAAA,CAAO;AAAA,EAC5C,WAAA,EAAa,GAAA;AAAA,EACb,WAAA,EAAa,GAAA;AAAA,EACb,aAAA,EAAe,GAAA;AAAA,EACf,aAAA,EAAe,GAAA;AAAA,EACf,eAAA,EAAiB,GAAA;AAAA,EACjB,kBAAA,EAAoB,GAAA;AAAA,EACpB,kBAAA,EAAoB;AACtB,CAAC,CAAA;AAEM,SAAS,cAAc,KAAA,EAAiD;AAC7E,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,wBAAA,EAA0B,GAAG,KAAA,EAAM;AACvD,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAA+B;AACjE,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,CAAC,OAAO,aAAA,CAAc,KAAK,KAAK,KAAA,GAAQ,CAAA,IAAK,KAAA,GAAQ,OAAA,CAAQ,GAAG,CAAA;AAClE,MAAA,MAAM,IAAI,WAAW,OAAO,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B","file":"limits.cjs","sourcesContent":["import type { KaladaV1Limits } from \"./types.js\";\n\nexport const DEFAULT_KALADA_V1_LIMITS: KaladaV1Limits = Object.freeze({\n maxAstDepth: 64,\n maxAstNodes: 10_000,\n maxValueDepth: 64,\n maxValueNodes: 10_000,\n maxStringLength: 10_000,\n maxReferenceLength: 1_000,\n maxEvaluationSteps: 10_000,\n});\n\nconst MAXIMUM: KaladaV1Limits = Object.freeze({\n maxAstDepth: 256,\n maxAstNodes: 100_000,\n maxValueDepth: 256,\n maxValueNodes: 100_000,\n maxStringLength: 1_000_000,\n maxReferenceLength: 100_000,\n maxEvaluationSteps: 100_000,\n});\n\nexport function resolveLimits(input?: Partial<KaladaV1Limits>): KaladaV1Limits {\n const limits = { ...DEFAULT_KALADA_V1_LIMITS, ...input };\n for (const key of Object.keys(limits) as (keyof KaladaV1Limits)[]) {\n const value = limits[key];\n if (!Number.isSafeInteger(value) || value < 1 || value > MAXIMUM[key])\n throw new RangeError(\"limit\");\n }\n return Object.freeze(limits);\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/limits.ts"],"names":[],"mappings":";;AAIO,MAAM,wBAAA,GAA2C,OAAO,MAAA,CAAO;AAAA,EACpE,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa,GAAA;AAAA,EACb,aAAA,EAAe,EAAA;AAAA,EACf,aAAA,EAAe,GAAA;AAAA,EACf,eAAA,EAAiB,GAAA;AAAA,EACjB,kBAAA,EAAoB,GAAA;AAAA,EACpB,kBAAA,EAAoB;AACtB,CAAC;AAEM,MAAM,iCAAA,GAA4D,OAAO,MAAA,CAAO;AAAA,EACrF,qBAAA,EAAuB,EAAA;AAAA,EACvB,oBAAA,EAAsB,EAAA;AAAA,EACtB,qBAAA,EAAuB,EAAA;AAAA,EACvB,mBAAA,EAAqB,GAAA;AAAA,EACrB,WAAA,EAAa,GAAA;AAAA,EACb,YAAA,EAAc,GAAA;AAAA,EACd,qBAAA,EAAuB,GAAA;AAAA,EACvB,mBAAA,EAAqB,GAAA;AAAA,EACrB,uBAAA,EAAyB;AAC3B,CAAC;AAED,MAAM,OAAA,GAAkC,OAAO,MAAA,CAAO;AAAA,EACpD,WAAA,EAAa,GAAA;AAAA,EACb,WAAA,EAAa,GAAA;AAAA,EACb,aAAA,EAAe,GAAA;AAAA,EACf,aAAA,EAAe,GAAA;AAAA,EACf,eAAA,EAAiB,GAAA;AAAA,EACjB,kBAAA,EAAoB,GAAA;AAAA,EACpB,kBAAA,EAAoB,GAAA;AAAA,EACpB,qBAAA,EAAuB,GAAA;AAAA,EACvB,oBAAA,EAAsB,IAAA;AAAA,EACtB,qBAAA,EAAuB,GAAA;AAAA,EACvB,mBAAA,EAAqB,GAAA;AAAA,EACrB,WAAA,EAAa,GAAA;AAAA,EACb,YAAA,EAAc,IAAA;AAAA,EACd,qBAAA,EAAuB,GAAA;AAAA,EACvB,mBAAA,EAAqB,GAAA;AAAA,EACrB,uBAAA,EAAyB;AAC3B,CAAC,CAAA;AAEM,SAAS,cAAc,KAAA,EAAiE;AAC7F,EAAA,MAAM,SAAS,EAAE,GAAG,0BAA0B,GAAG,iCAAA,EAAmC,GAAG,KAAA,EAAM;AAC7F,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAuC;AACzE,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,CAAC,OAAO,aAAA,CAAc,KAAK,KAAK,KAAA,GAAQ,CAAA,IAAK,KAAA,GAAQ,OAAA,CAAQ,GAAG,CAAA;AAClE,MAAA,MAAM,IAAI,WAAW,OAAO,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B","file":"limits.cjs","sourcesContent":["import type { KaladaV1FunctionLimits, KaladaV1Limits } from \"./types.js\";\n\nexport type ResolvedKaladaV1Limits = KaladaV1Limits & KaladaV1FunctionLimits;\n\nexport const DEFAULT_KALADA_V1_LIMITS: KaladaV1Limits = Object.freeze({\n maxAstDepth: 64,\n maxAstNodes: 10_000,\n maxValueDepth: 64,\n maxValueNodes: 10_000,\n maxStringLength: 10_000,\n maxReferenceLength: 1_000,\n maxEvaluationSteps: 10_000,\n});\n\nexport const DEFAULT_KALADA_V1_FUNCTION_LIMITS: KaladaV1FunctionLimits = Object.freeze({\n maxFunctionParameters: 32,\n maxFunctionGroupSize: 64,\n maxCapturesPerClosure: 64,\n maxCapturedBindings: 1_000,\n maxClosures: 1_000,\n maxCallDepth: 256,\n maxContinuationFrames: 1_000,\n maxCollectionLength: 10_000,\n maxCollectionIterations: 10_000,\n});\n\nconst MAXIMUM: ResolvedKaladaV1Limits = Object.freeze({\n maxAstDepth: 256,\n maxAstNodes: 100_000,\n maxValueDepth: 256,\n maxValueNodes: 100_000,\n maxStringLength: 1_000_000,\n maxReferenceLength: 100_000,\n maxEvaluationSteps: 100_000,\n maxFunctionParameters: 256,\n maxFunctionGroupSize: 1_024,\n maxCapturesPerClosure: 256,\n maxCapturedBindings: 100_000,\n maxClosures: 100_000,\n maxCallDepth: 4_096,\n maxContinuationFrames: 100_000,\n maxCollectionLength: 100_000,\n maxCollectionIterations: 100_000,\n});\n\nexport function resolveLimits(input?: Partial<ResolvedKaladaV1Limits>): ResolvedKaladaV1Limits {\n const limits = { ...DEFAULT_KALADA_V1_LIMITS, ...DEFAULT_KALADA_V1_FUNCTION_LIMITS, ...input };\n for (const key of Object.keys(limits) as (keyof ResolvedKaladaV1Limits)[]) {\n const value = limits[key];\n if (!Number.isSafeInteger(value) || value < 1 || value > MAXIMUM[key])\n throw new RangeError(\"limit\");\n }\n return Object.freeze(limits);\n}\n"]}
@@ -1,9 +1,11 @@
1
- import { KaladaV1Limits } from './types.cjs';
1
+ import { KaladaV1Limits, KaladaV1FunctionLimits } from './types.cjs';
2
2
  import './json.cjs';
3
3
  import './temporal.cjs';
4
4
  import './values.cjs';
5
5
 
6
+ type ResolvedKaladaV1Limits = KaladaV1Limits & KaladaV1FunctionLimits;
6
7
  declare const DEFAULT_KALADA_V1_LIMITS: KaladaV1Limits;
7
- declare function resolveLimits(input?: Partial<KaladaV1Limits>): KaladaV1Limits;
8
+ declare const DEFAULT_KALADA_V1_FUNCTION_LIMITS: KaladaV1FunctionLimits;
9
+ declare function resolveLimits(input?: Partial<ResolvedKaladaV1Limits>): ResolvedKaladaV1Limits;
8
10
 
9
- export { DEFAULT_KALADA_V1_LIMITS, resolveLimits };
11
+ export { DEFAULT_KALADA_V1_FUNCTION_LIMITS, DEFAULT_KALADA_V1_LIMITS, type ResolvedKaladaV1Limits, resolveLimits };
@@ -1,9 +1,11 @@
1
- import { KaladaV1Limits } from './types.js';
1
+ import { KaladaV1Limits, KaladaV1FunctionLimits } from './types.js';
2
2
  import './json.js';
3
3
  import './temporal.js';
4
4
  import './values.js';
5
5
 
6
+ type ResolvedKaladaV1Limits = KaladaV1Limits & KaladaV1FunctionLimits;
6
7
  declare const DEFAULT_KALADA_V1_LIMITS: KaladaV1Limits;
7
- declare function resolveLimits(input?: Partial<KaladaV1Limits>): KaladaV1Limits;
8
+ declare const DEFAULT_KALADA_V1_FUNCTION_LIMITS: KaladaV1FunctionLimits;
9
+ declare function resolveLimits(input?: Partial<ResolvedKaladaV1Limits>): ResolvedKaladaV1Limits;
8
10
 
9
- export { DEFAULT_KALADA_V1_LIMITS, resolveLimits };
11
+ export { DEFAULT_KALADA_V1_FUNCTION_LIMITS, DEFAULT_KALADA_V1_LIMITS, type ResolvedKaladaV1Limits, resolveLimits };
@@ -7,6 +7,17 @@ const DEFAULT_KALADA_V1_LIMITS = Object.freeze({
7
7
  maxReferenceLength: 1e3,
8
8
  maxEvaluationSteps: 1e4
9
9
  });
10
+ const DEFAULT_KALADA_V1_FUNCTION_LIMITS = Object.freeze({
11
+ maxFunctionParameters: 32,
12
+ maxFunctionGroupSize: 64,
13
+ maxCapturesPerClosure: 64,
14
+ maxCapturedBindings: 1e3,
15
+ maxClosures: 1e3,
16
+ maxCallDepth: 256,
17
+ maxContinuationFrames: 1e3,
18
+ maxCollectionLength: 1e4,
19
+ maxCollectionIterations: 1e4
20
+ });
10
21
  const MAXIMUM = Object.freeze({
11
22
  maxAstDepth: 256,
12
23
  maxAstNodes: 1e5,
@@ -14,10 +25,19 @@ const MAXIMUM = Object.freeze({
14
25
  maxValueNodes: 1e5,
15
26
  maxStringLength: 1e6,
16
27
  maxReferenceLength: 1e5,
17
- maxEvaluationSteps: 1e5
28
+ maxEvaluationSteps: 1e5,
29
+ maxFunctionParameters: 256,
30
+ maxFunctionGroupSize: 1024,
31
+ maxCapturesPerClosure: 256,
32
+ maxCapturedBindings: 1e5,
33
+ maxClosures: 1e5,
34
+ maxCallDepth: 4096,
35
+ maxContinuationFrames: 1e5,
36
+ maxCollectionLength: 1e5,
37
+ maxCollectionIterations: 1e5
18
38
  });
19
39
  function resolveLimits(input) {
20
- const limits = { ...DEFAULT_KALADA_V1_LIMITS, ...input };
40
+ const limits = { ...DEFAULT_KALADA_V1_LIMITS, ...DEFAULT_KALADA_V1_FUNCTION_LIMITS, ...input };
21
41
  for (const key of Object.keys(limits)) {
22
42
  const value = limits[key];
23
43
  if (!Number.isSafeInteger(value) || value < 1 || value > MAXIMUM[key])
@@ -26,6 +46,6 @@ function resolveLimits(input) {
26
46
  return Object.freeze(limits);
27
47
  }
28
48
 
29
- export { DEFAULT_KALADA_V1_LIMITS, resolveLimits };
49
+ export { DEFAULT_KALADA_V1_FUNCTION_LIMITS, DEFAULT_KALADA_V1_LIMITS, resolveLimits };
30
50
  //# sourceMappingURL=limits.js.map
31
51
  //# sourceMappingURL=limits.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/kalada-v1/limits.ts"],"names":[],"mappings":"AAEO,MAAM,wBAAA,GAA2C,OAAO,MAAA,CAAO;AAAA,EACpE,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa,GAAA;AAAA,EACb,aAAA,EAAe,EAAA;AAAA,EACf,aAAA,EAAe,GAAA;AAAA,EACf,eAAA,EAAiB,GAAA;AAAA,EACjB,kBAAA,EAAoB,GAAA;AAAA,EACpB,kBAAA,EAAoB;AACtB,CAAC;AAED,MAAM,OAAA,GAA0B,OAAO,MAAA,CAAO;AAAA,EAC5C,WAAA,EAAa,GAAA;AAAA,EACb,WAAA,EAAa,GAAA;AAAA,EACb,aAAA,EAAe,GAAA;AAAA,EACf,aAAA,EAAe,GAAA;AAAA,EACf,eAAA,EAAiB,GAAA;AAAA,EACjB,kBAAA,EAAoB,GAAA;AAAA,EACpB,kBAAA,EAAoB;AACtB,CAAC,CAAA;AAEM,SAAS,cAAc,KAAA,EAAiD;AAC7E,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,wBAAA,EAA0B,GAAG,KAAA,EAAM;AACvD,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAA+B;AACjE,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,CAAC,OAAO,aAAA,CAAc,KAAK,KAAK,KAAA,GAAQ,CAAA,IAAK,KAAA,GAAQ,OAAA,CAAQ,GAAG,CAAA;AAClE,MAAA,MAAM,IAAI,WAAW,OAAO,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B","file":"limits.js","sourcesContent":["import type { KaladaV1Limits } from \"./types.js\";\n\nexport const DEFAULT_KALADA_V1_LIMITS: KaladaV1Limits = Object.freeze({\n maxAstDepth: 64,\n maxAstNodes: 10_000,\n maxValueDepth: 64,\n maxValueNodes: 10_000,\n maxStringLength: 10_000,\n maxReferenceLength: 1_000,\n maxEvaluationSteps: 10_000,\n});\n\nconst MAXIMUM: KaladaV1Limits = Object.freeze({\n maxAstDepth: 256,\n maxAstNodes: 100_000,\n maxValueDepth: 256,\n maxValueNodes: 100_000,\n maxStringLength: 1_000_000,\n maxReferenceLength: 100_000,\n maxEvaluationSteps: 100_000,\n});\n\nexport function resolveLimits(input?: Partial<KaladaV1Limits>): KaladaV1Limits {\n const limits = { ...DEFAULT_KALADA_V1_LIMITS, ...input };\n for (const key of Object.keys(limits) as (keyof KaladaV1Limits)[]) {\n const value = limits[key];\n if (!Number.isSafeInteger(value) || value < 1 || value > MAXIMUM[key])\n throw new RangeError(\"limit\");\n }\n return Object.freeze(limits);\n}\n"]}
1
+ {"version":3,"sources":["../../src/kalada-v1/limits.ts"],"names":[],"mappings":"AAIO,MAAM,wBAAA,GAA2C,OAAO,MAAA,CAAO;AAAA,EACpE,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa,GAAA;AAAA,EACb,aAAA,EAAe,EAAA;AAAA,EACf,aAAA,EAAe,GAAA;AAAA,EACf,eAAA,EAAiB,GAAA;AAAA,EACjB,kBAAA,EAAoB,GAAA;AAAA,EACpB,kBAAA,EAAoB;AACtB,CAAC;AAEM,MAAM,iCAAA,GAA4D,OAAO,MAAA,CAAO;AAAA,EACrF,qBAAA,EAAuB,EAAA;AAAA,EACvB,oBAAA,EAAsB,EAAA;AAAA,EACtB,qBAAA,EAAuB,EAAA;AAAA,EACvB,mBAAA,EAAqB,GAAA;AAAA,EACrB,WAAA,EAAa,GAAA;AAAA,EACb,YAAA,EAAc,GAAA;AAAA,EACd,qBAAA,EAAuB,GAAA;AAAA,EACvB,mBAAA,EAAqB,GAAA;AAAA,EACrB,uBAAA,EAAyB;AAC3B,CAAC;AAED,MAAM,OAAA,GAAkC,OAAO,MAAA,CAAO;AAAA,EACpD,WAAA,EAAa,GAAA;AAAA,EACb,WAAA,EAAa,GAAA;AAAA,EACb,aAAA,EAAe,GAAA;AAAA,EACf,aAAA,EAAe,GAAA;AAAA,EACf,eAAA,EAAiB,GAAA;AAAA,EACjB,kBAAA,EAAoB,GAAA;AAAA,EACpB,kBAAA,EAAoB,GAAA;AAAA,EACpB,qBAAA,EAAuB,GAAA;AAAA,EACvB,oBAAA,EAAsB,IAAA;AAAA,EACtB,qBAAA,EAAuB,GAAA;AAAA,EACvB,mBAAA,EAAqB,GAAA;AAAA,EACrB,WAAA,EAAa,GAAA;AAAA,EACb,YAAA,EAAc,IAAA;AAAA,EACd,qBAAA,EAAuB,GAAA;AAAA,EACvB,mBAAA,EAAqB,GAAA;AAAA,EACrB,uBAAA,EAAyB;AAC3B,CAAC,CAAA;AAEM,SAAS,cAAc,KAAA,EAAiE;AAC7F,EAAA,MAAM,SAAS,EAAE,GAAG,0BAA0B,GAAG,iCAAA,EAAmC,GAAG,KAAA,EAAM;AAC7F,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAuC;AACzE,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,CAAC,OAAO,aAAA,CAAc,KAAK,KAAK,KAAA,GAAQ,CAAA,IAAK,KAAA,GAAQ,OAAA,CAAQ,GAAG,CAAA;AAClE,MAAA,MAAM,IAAI,WAAW,OAAO,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B","file":"limits.js","sourcesContent":["import type { KaladaV1FunctionLimits, KaladaV1Limits } from \"./types.js\";\n\nexport type ResolvedKaladaV1Limits = KaladaV1Limits & KaladaV1FunctionLimits;\n\nexport const DEFAULT_KALADA_V1_LIMITS: KaladaV1Limits = Object.freeze({\n maxAstDepth: 64,\n maxAstNodes: 10_000,\n maxValueDepth: 64,\n maxValueNodes: 10_000,\n maxStringLength: 10_000,\n maxReferenceLength: 1_000,\n maxEvaluationSteps: 10_000,\n});\n\nexport const DEFAULT_KALADA_V1_FUNCTION_LIMITS: KaladaV1FunctionLimits = Object.freeze({\n maxFunctionParameters: 32,\n maxFunctionGroupSize: 64,\n maxCapturesPerClosure: 64,\n maxCapturedBindings: 1_000,\n maxClosures: 1_000,\n maxCallDepth: 256,\n maxContinuationFrames: 1_000,\n maxCollectionLength: 10_000,\n maxCollectionIterations: 10_000,\n});\n\nconst MAXIMUM: ResolvedKaladaV1Limits = Object.freeze({\n maxAstDepth: 256,\n maxAstNodes: 100_000,\n maxValueDepth: 256,\n maxValueNodes: 100_000,\n maxStringLength: 1_000_000,\n maxReferenceLength: 100_000,\n maxEvaluationSteps: 100_000,\n maxFunctionParameters: 256,\n maxFunctionGroupSize: 1_024,\n maxCapturesPerClosure: 256,\n maxCapturedBindings: 100_000,\n maxClosures: 100_000,\n maxCallDepth: 4_096,\n maxContinuationFrames: 100_000,\n maxCollectionLength: 100_000,\n maxCollectionIterations: 100_000,\n});\n\nexport function resolveLimits(input?: Partial<ResolvedKaladaV1Limits>): ResolvedKaladaV1Limits {\n const limits = { ...DEFAULT_KALADA_V1_LIMITS, ...DEFAULT_KALADA_V1_FUNCTION_LIMITS, ...input };\n for (const key of Object.keys(limits) as (keyof ResolvedKaladaV1Limits)[]) {\n const value = limits[key];\n if (!Number.isSafeInteger(value) || value < 1 || value > MAXIMUM[key])\n throw new RangeError(\"limit\");\n }\n return Object.freeze(limits);\n}\n"]}
@@ -0,0 +1,112 @@
1
+ 'use strict';
2
+
3
+ var temporal_js = require('./temporal.js');
4
+ var values_js = require('./values.js');
5
+
6
+ const callables = /* @__PURE__ */ new WeakSet();
7
+ function isCallable(value) {
8
+ return typeof value === "object" && value !== null && callables.has(value);
9
+ }
10
+ function coreCallable(name) {
11
+ return branded({ callable: "core", name });
12
+ }
13
+ function callableType(value) {
14
+ if (value.callable === "user") {
15
+ return Object.freeze({
16
+ kind: "function-type",
17
+ parameters: Object.freeze(value.parameters.map((item) => item.type)),
18
+ returns: value.returns
19
+ });
20
+ }
21
+ const json = primitive("json");
22
+ const callback = functionType(
23
+ [json, primitive("number")],
24
+ primitive(value.name === "map" ? "json" : "boolean")
25
+ );
26
+ const array = Object.freeze({ kind: "array-type", element: json });
27
+ return functionType(
28
+ [array, callback],
29
+ value.name === "some" || value.name === "every" ? primitive("boolean") : array
30
+ );
31
+ }
32
+ function matchesType(value, expected) {
33
+ if (expected.kind === "function-type") {
34
+ return isCallable(value) && equalType(callableType(value), expected);
35
+ }
36
+ if (isCallable(value)) return false;
37
+ if (expected.kind === "primitive-type") return matchesPrimitive(value, expected.name);
38
+ if (expected.kind === "option-type") {
39
+ return values_js.isOption(value) && (value.variant === "none" || matchesType(value.value, expected.value));
40
+ }
41
+ if (expected.kind === "result-type") {
42
+ return values_js.isResult(value) && matchesType(value.value, value.variant === "ok" ? expected.ok : expected.error);
43
+ }
44
+ return Array.isArray(value) && value.every((item) => matchesType(item, expected.element));
45
+ }
46
+ function closureFromExpression(node, path, captures) {
47
+ return branded({
48
+ callable: "user",
49
+ name: null,
50
+ path,
51
+ parameters: node.parameters,
52
+ returns: node.returns,
53
+ body: node.body,
54
+ captures,
55
+ recursive: null
56
+ });
57
+ }
58
+ function closureFromMember(node, path, captures, recursive) {
59
+ return branded({
60
+ callable: "user",
61
+ name: node.name,
62
+ path,
63
+ parameters: node.parameters,
64
+ returns: node.returns,
65
+ body: node.body,
66
+ captures,
67
+ recursive
68
+ });
69
+ }
70
+ function branded(value) {
71
+ Object.freeze(value);
72
+ callables.add(value);
73
+ return value;
74
+ }
75
+ function matchesPrimitive(value, name) {
76
+ if (name === "json")
77
+ return !values_js.isOption(value) && !values_js.isResult(value) && !temporal_js.isInstant(value) && !temporal_js.isDuration(value);
78
+ if (name === "Instant") return temporal_js.isInstant(value);
79
+ if (name === "Duration") return temporal_js.isDuration(value);
80
+ if (name === "null") return value === null;
81
+ return typeof value === name;
82
+ }
83
+ function equalType(left, right) {
84
+ if (left.kind !== right.kind) return false;
85
+ if (left.kind === "primitive-type" && right.kind === "primitive-type")
86
+ return left.name === right.name;
87
+ if (left.kind === "option-type" && right.kind === "option-type")
88
+ return equalType(left.value, right.value);
89
+ if (left.kind === "array-type" && right.kind === "array-type")
90
+ return equalType(left.element, right.element);
91
+ if (left.kind === "result-type" && right.kind === "result-type")
92
+ return equalType(left.ok, right.ok) && equalType(left.error, right.error);
93
+ if (left.kind !== "function-type" || right.kind !== "function-type") return false;
94
+ return left.parameters.length === right.parameters.length && left.parameters.every(
95
+ (item, index) => equalType(item, right.parameters[index])
96
+ ) && equalType(left.returns, right.returns);
97
+ }
98
+ function primitive(name) {
99
+ return Object.freeze({ kind: "primitive-type", name });
100
+ }
101
+ function functionType(parameters, returns) {
102
+ return Object.freeze({ kind: "function-type", parameters: Object.freeze(parameters), returns });
103
+ }
104
+
105
+ exports.callableType = callableType;
106
+ exports.closureFromExpression = closureFromExpression;
107
+ exports.closureFromMember = closureFromMember;
108
+ exports.coreCallable = coreCallable;
109
+ exports.isCallable = isCallable;
110
+ exports.matchesType = matchesType;
111
+ //# sourceMappingURL=runtime-values.cjs.map
112
+ //# sourceMappingURL=runtime-values.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/runtime-values.ts"],"names":["isOption","isResult","isInstant","isDuration"],"mappings":";;;;;AAoCA,MAAM,SAAA,uBAAgB,OAAA,EAAgB;AAE/B,SAAS,WAAW,KAAA,EAAqE;AAC9F,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,SAAA,CAAU,IAAI,KAAK,CAAA;AAC3E;AAEO,SAAS,aAAa,IAAA,EAA4C;AACvE,EAAA,OAAO,OAAA,CAAQ,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AAC3C;AAEO,SAAS,aAAa,KAAA,EAAkE;AAC7F,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAQ;AAC7B,IAAA,OAAO,OAAO,MAAA,CAAO;AAAA,MACnB,IAAA,EAAM,eAAA;AAAA,MACN,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MACnE,SAAS,KAAA,CAAM;AAAA,KAChB,CAAA;AAAA,EACH;AACA,EAAA,MAAM,IAAA,GAAO,UAAU,MAAM,CAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,YAAA;AAAA,IACf,CAAC,IAAA,EAAM,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,IAC1B,SAAA,CAAU,KAAA,CAAM,IAAA,KAAS,KAAA,GAAQ,SAAS,SAAS;AAAA,GACrD;AACA,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,CAAO,EAAE,MAAM,YAAA,EAAc,OAAA,EAAS,MAAM,CAAA;AACjE,EAAA,OAAO,YAAA;AAAA,IACL,CAAC,OAAO,QAAQ,CAAA;AAAA,IAChB,KAAA,CAAM,SAAS,MAAA,IAAU,KAAA,CAAM,SAAS,OAAA,GAAU,SAAA,CAAU,SAAS,CAAA,GAAI;AAAA,GAC3E;AACF;AAEO,SAAS,WAAA,CAAY,OAAqB,QAAA,EAA+B;AAC9E,EAAA,IAAI,QAAA,CAAS,SAAS,eAAA,EAAiB;AACrC,IAAA,OAAO,WAAW,KAAK,CAAA,IAAK,UAAU,YAAA,CAAa,KAAK,GAAG,QAAQ,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,EAAG,OAAO,KAAA;AAC9B,EAAA,IAAI,SAAS,IAAA,KAAS,gBAAA,SAAyB,gBAAA,CAAiB,KAAA,EAAO,SAAS,IAAI,CAAA;AACpF,EAAA,IAAI,QAAA,CAAS,SAAS,aAAA,EAAe;AACnC,IAAA,OACEA,kBAAA,CAAS,KAAK,CAAA,KAAM,KAAA,CAAM,OAAA,KAAY,UAAU,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,QAAA,CAAS,KAAK,CAAA,CAAA;AAAA,EAE3F;AACA,EAAA,IAAI,QAAA,CAAS,SAAS,aAAA,EAAe;AACnC,IAAA,OACEC,kBAAA,CAAS,KAAK,CAAA,IACd,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,OAAA,KAAY,IAAA,GAAO,QAAA,CAAS,EAAA,GAAK,QAAA,CAAS,KAAK,CAAA;AAAA,EAElF;AACA,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,CAAC,IAAA,KAAS,WAAA,CAAY,IAAA,EAAM,QAAA,CAAS,OAAO,CAAC,CAAA;AAC1F;AAEO,SAAS,qBAAA,CACd,IAAA,EACA,IAAA,EACA,QAAA,EACgB;AAChB,EAAA,OAAO,OAAA,CAAQ;AAAA,IACb,QAAA,EAAU,MAAA;AAAA,IACV,IAAA,EAAM,IAAA;AAAA,IACN,IAAA;AAAA,IACA,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,QAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACZ,CAAA;AACH;AAEO,SAAS,iBAAA,CACd,IAAA,EACA,IAAA,EACA,QAAA,EACA,SAAA,EACgB;AAChB,EAAA,OAAO,OAAA,CAAQ;AAAA,IACb,QAAA,EAAU,MAAA;AAAA,IACV,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,IAAA;AAAA,IACA,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAEA,SAAS,QAA0B,KAAA,EAAa;AAC9C,EAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AACnB,EAAA,SAAA,CAAU,IAAI,KAAK,CAAA;AACnB,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,OAAoB,IAAA,EAAuB;AACnE,EAAA,IAAI,IAAA,KAAS,MAAA;AACX,IAAA,OAAO,CAACD,kBAAA,CAAS,KAAK,CAAA,IAAK,CAACC,kBAAA,CAAS,KAAK,CAAA,IAAK,CAACC,qBAAA,CAAU,KAAK,CAAA,IAAK,CAACC,uBAAW,KAAK,CAAA;AACvF,EAAA,IAAI,IAAA,KAAS,SAAA,EAAW,OAAOD,qBAAA,CAAU,KAAK,CAAA;AAC9C,EAAA,IAAI,IAAA,KAAS,UAAA,EAAY,OAAOC,sBAAA,CAAW,KAAK,CAAA;AAChD,EAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,OAAO,KAAA,KAAU,IAAA;AACtC,EAAA,OAAO,OAAO,KAAA,KAAU,IAAA;AAC1B;AAEA,SAAS,SAAA,CAAU,MAAkB,KAAA,EAA4B;AAC/D,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,KAAA,CAAM,IAAA,EAAM,OAAO,KAAA;AACrC,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,gBAAA,IAAoB,KAAA,CAAM,IAAA,KAAS,gBAAA;AACnD,IAAA,OAAO,IAAA,CAAK,SAAS,KAAA,CAAM,IAAA;AAC7B,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,IAAA,KAAS,aAAA;AAChD,IAAA,OAAO,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA;AAC1C,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,YAAA,IAAgB,KAAA,CAAM,IAAA,KAAS,YAAA;AAC/C,IAAA,OAAO,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,KAAA,CAAM,OAAO,CAAA;AAC9C,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,IAAA,KAAS,aAAA;AAChD,IAAA,OAAO,SAAA,CAAU,IAAA,CAAK,EAAA,EAAI,KAAA,CAAM,EAAE,KAAK,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA;AAC1E,EAAA,IAAI,KAAK,IAAA,KAAS,eAAA,IAAmB,KAAA,CAAM,IAAA,KAAS,iBAAiB,OAAO,KAAA;AAC5E,EAAA,OACE,KAAK,UAAA,CAAW,MAAA,KAAW,MAAM,UAAA,CAAW,MAAA,IAC5C,KAAK,UAAA,CAAW,KAAA;AAAA,IAAM,CAAC,MAAM,KAAA,KAC3B,SAAA,CAAU,MAAM,KAAA,CAAM,UAAA,CAAW,KAAK,CAAe;AAAA,GACvD,IACA,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,MAAM,OAAO,CAAA;AAEzC;AAEA,SAAS,UAAU,IAAA,EAAiD;AAClE,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAM,CAAA;AACvD;AAEA,SAAS,YAAA,CAAa,YAAmC,OAAA,EAAyC;AAChG,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,EAAG,OAAA,EAAS,CAAA;AAChG","file":"runtime-values.cjs","sourcesContent":["import type { JsonValue } from \"./json.js\";\nimport { isDuration, isInstant } from \"./temporal.js\";\nimport type {\n KaladaCoreFunctionName,\n KaladaFunctionParameter,\n KaladaFunctionType,\n KaladaType,\n KaladaV1Expression,\n NamedFunction,\n} from \"./types.js\";\nimport { isOption, isResult, type KaladaValue } from \"./values.js\";\n\nexport type RuntimeEnvironment = ReadonlyMap<string, RuntimeValue>;\nexport type RuntimeValue = KaladaValue | UserClosure<JsonValue> | CoreCallable;\n\nexport interface RecursiveEnvironment<R extends JsonValue> {\n readonly names: readonly string[];\n readonly closures: readonly UserClosure<R>[];\n}\n\nexport interface UserClosure<R extends JsonValue> {\n readonly callable: \"user\";\n readonly name: string | null;\n readonly path: readonly (string | number)[];\n readonly parameters: readonly KaladaFunctionParameter[];\n readonly returns: KaladaType;\n readonly body: KaladaV1Expression<R>;\n readonly captures: RuntimeEnvironment;\n readonly recursive: RecursiveEnvironment<R> | null;\n}\n\nexport interface CoreCallable {\n readonly callable: \"core\";\n readonly name: KaladaCoreFunctionName;\n}\n\nconst callables = new WeakSet<object>();\n\nexport function isCallable(value: RuntimeValue): value is UserClosure<JsonValue> | CoreCallable {\n return typeof value === \"object\" && value !== null && callables.has(value);\n}\n\nexport function coreCallable(name: KaladaCoreFunctionName): CoreCallable {\n return branded({ callable: \"core\", name });\n}\n\nexport function callableType(value: UserClosure<JsonValue> | CoreCallable): KaladaFunctionType {\n if (value.callable === \"user\") {\n return Object.freeze({\n kind: \"function-type\",\n parameters: Object.freeze(value.parameters.map((item) => item.type)),\n returns: value.returns,\n });\n }\n const json = primitive(\"json\");\n const callback = functionType(\n [json, primitive(\"number\")],\n primitive(value.name === \"map\" ? \"json\" : \"boolean\"),\n );\n const array = Object.freeze({ kind: \"array-type\", element: json }) as KaladaType;\n return functionType(\n [array, callback],\n value.name === \"some\" || value.name === \"every\" ? primitive(\"boolean\") : array,\n );\n}\n\nexport function matchesType(value: RuntimeValue, expected: KaladaType): boolean {\n if (expected.kind === \"function-type\") {\n return isCallable(value) && equalType(callableType(value), expected);\n }\n if (isCallable(value)) return false;\n if (expected.kind === \"primitive-type\") return matchesPrimitive(value, expected.name);\n if (expected.kind === \"option-type\") {\n return (\n isOption(value) && (value.variant === \"none\" || matchesType(value.value, expected.value))\n );\n }\n if (expected.kind === \"result-type\") {\n return (\n isResult(value) &&\n matchesType(value.value, value.variant === \"ok\" ? expected.ok : expected.error)\n );\n }\n return Array.isArray(value) && value.every((item) => matchesType(item, expected.element));\n}\n\nexport function closureFromExpression<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"function\" }>,\n path: readonly (string | number)[],\n captures: RuntimeEnvironment,\n): UserClosure<R> {\n return branded({\n callable: \"user\",\n name: null,\n path,\n parameters: node.parameters,\n returns: node.returns,\n body: node.body,\n captures,\n recursive: null,\n });\n}\n\nexport function closureFromMember<R extends JsonValue>(\n node: NamedFunction<R>,\n path: readonly (string | number)[],\n captures: RuntimeEnvironment,\n recursive: RecursiveEnvironment<R>,\n): UserClosure<R> {\n return branded({\n callable: \"user\",\n name: node.name,\n path,\n parameters: node.parameters,\n returns: node.returns,\n body: node.body,\n captures,\n recursive,\n });\n}\n\nfunction branded<T extends object>(value: T): T {\n Object.freeze(value);\n callables.add(value);\n return value;\n}\n\nfunction matchesPrimitive(value: KaladaValue, name: string): boolean {\n if (name === \"json\")\n return !isOption(value) && !isResult(value) && !isInstant(value) && !isDuration(value);\n if (name === \"Instant\") return isInstant(value);\n if (name === \"Duration\") return isDuration(value);\n if (name === \"null\") return value === null;\n return typeof value === name;\n}\n\nfunction equalType(left: KaladaType, right: KaladaType): boolean {\n if (left.kind !== right.kind) return false;\n if (left.kind === \"primitive-type\" && right.kind === \"primitive-type\")\n return left.name === right.name;\n if (left.kind === \"option-type\" && right.kind === \"option-type\")\n return equalType(left.value, right.value);\n if (left.kind === \"array-type\" && right.kind === \"array-type\")\n return equalType(left.element, right.element);\n if (left.kind === \"result-type\" && right.kind === \"result-type\")\n return equalType(left.ok, right.ok) && equalType(left.error, right.error);\n if (left.kind !== \"function-type\" || right.kind !== \"function-type\") return false;\n return (\n left.parameters.length === right.parameters.length &&\n left.parameters.every((item, index) =>\n equalType(item, right.parameters[index] as KaladaType),\n ) &&\n equalType(left.returns, right.returns)\n );\n}\n\nfunction primitive(name: \"number\" | \"boolean\" | \"json\"): KaladaType {\n return Object.freeze({ kind: \"primitive-type\", name });\n}\n\nfunction functionType(parameters: readonly KaladaType[], returns: KaladaType): KaladaFunctionType {\n return Object.freeze({ kind: \"function-type\", parameters: Object.freeze(parameters), returns });\n}\n"]}
@@ -0,0 +1,35 @@
1
+ import { JsonValue } from './json.cjs';
2
+ import { KaladaFunctionParameter, KaladaType, KaladaV1Expression, KaladaCoreFunctionName, KaladaFunctionType, NamedFunction } from './types.cjs';
3
+ import { KaladaValue } from './values.cjs';
4
+ import './temporal.cjs';
5
+
6
+ type RuntimeEnvironment = ReadonlyMap<string, RuntimeValue>;
7
+ type RuntimeValue = KaladaValue | UserClosure<JsonValue> | CoreCallable;
8
+ interface RecursiveEnvironment<R extends JsonValue> {
9
+ readonly names: readonly string[];
10
+ readonly closures: readonly UserClosure<R>[];
11
+ }
12
+ interface UserClosure<R extends JsonValue> {
13
+ readonly callable: "user";
14
+ readonly name: string | null;
15
+ readonly path: readonly (string | number)[];
16
+ readonly parameters: readonly KaladaFunctionParameter[];
17
+ readonly returns: KaladaType;
18
+ readonly body: KaladaV1Expression<R>;
19
+ readonly captures: RuntimeEnvironment;
20
+ readonly recursive: RecursiveEnvironment<R> | null;
21
+ }
22
+ interface CoreCallable {
23
+ readonly callable: "core";
24
+ readonly name: KaladaCoreFunctionName;
25
+ }
26
+ declare function isCallable(value: RuntimeValue): value is UserClosure<JsonValue> | CoreCallable;
27
+ declare function coreCallable(name: KaladaCoreFunctionName): CoreCallable;
28
+ declare function callableType(value: UserClosure<JsonValue> | CoreCallable): KaladaFunctionType;
29
+ declare function matchesType(value: RuntimeValue, expected: KaladaType): boolean;
30
+ declare function closureFromExpression<R extends JsonValue>(node: Extract<KaladaV1Expression<R>, {
31
+ kind: "function";
32
+ }>, path: readonly (string | number)[], captures: RuntimeEnvironment): UserClosure<R>;
33
+ declare function closureFromMember<R extends JsonValue>(node: NamedFunction<R>, path: readonly (string | number)[], captures: RuntimeEnvironment, recursive: RecursiveEnvironment<R>): UserClosure<R>;
34
+
35
+ export { type CoreCallable, type RecursiveEnvironment, type RuntimeEnvironment, type RuntimeValue, type UserClosure, callableType, closureFromExpression, closureFromMember, coreCallable, isCallable, matchesType };
@@ -0,0 +1,35 @@
1
+ import { JsonValue } from './json.js';
2
+ import { KaladaFunctionParameter, KaladaType, KaladaV1Expression, KaladaCoreFunctionName, KaladaFunctionType, NamedFunction } from './types.js';
3
+ import { KaladaValue } from './values.js';
4
+ import './temporal.js';
5
+
6
+ type RuntimeEnvironment = ReadonlyMap<string, RuntimeValue>;
7
+ type RuntimeValue = KaladaValue | UserClosure<JsonValue> | CoreCallable;
8
+ interface RecursiveEnvironment<R extends JsonValue> {
9
+ readonly names: readonly string[];
10
+ readonly closures: readonly UserClosure<R>[];
11
+ }
12
+ interface UserClosure<R extends JsonValue> {
13
+ readonly callable: "user";
14
+ readonly name: string | null;
15
+ readonly path: readonly (string | number)[];
16
+ readonly parameters: readonly KaladaFunctionParameter[];
17
+ readonly returns: KaladaType;
18
+ readonly body: KaladaV1Expression<R>;
19
+ readonly captures: RuntimeEnvironment;
20
+ readonly recursive: RecursiveEnvironment<R> | null;
21
+ }
22
+ interface CoreCallable {
23
+ readonly callable: "core";
24
+ readonly name: KaladaCoreFunctionName;
25
+ }
26
+ declare function isCallable(value: RuntimeValue): value is UserClosure<JsonValue> | CoreCallable;
27
+ declare function coreCallable(name: KaladaCoreFunctionName): CoreCallable;
28
+ declare function callableType(value: UserClosure<JsonValue> | CoreCallable): KaladaFunctionType;
29
+ declare function matchesType(value: RuntimeValue, expected: KaladaType): boolean;
30
+ declare function closureFromExpression<R extends JsonValue>(node: Extract<KaladaV1Expression<R>, {
31
+ kind: "function";
32
+ }>, path: readonly (string | number)[], captures: RuntimeEnvironment): UserClosure<R>;
33
+ declare function closureFromMember<R extends JsonValue>(node: NamedFunction<R>, path: readonly (string | number)[], captures: RuntimeEnvironment, recursive: RecursiveEnvironment<R>): UserClosure<R>;
34
+
35
+ export { type CoreCallable, type RecursiveEnvironment, type RuntimeEnvironment, type RuntimeValue, type UserClosure, callableType, closureFromExpression, closureFromMember, coreCallable, isCallable, matchesType };