@kalada/core 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/dist/kalada-v1/canonical-input.cjs +133 -0
- package/dist/kalada-v1/canonical-input.cjs.map +1 -0
- package/dist/kalada-v1/canonical-input.d.cts +25 -0
- package/dist/kalada-v1/canonical-input.d.ts +25 -0
- package/dist/kalada-v1/canonical-input.js +122 -0
- package/dist/kalada-v1/canonical-input.js.map +1 -0
- package/dist/kalada-v1/canonicalize.cjs +214 -0
- package/dist/kalada-v1/canonicalize.cjs.map +1 -0
- package/dist/kalada-v1/canonicalize.d.cts +8 -0
- package/dist/kalada-v1/canonicalize.d.ts +8 -0
- package/dist/kalada-v1/canonicalize.js +212 -0
- package/dist/kalada-v1/canonicalize.js.map +1 -0
- package/dist/kalada-v1/codec.cjs +173 -0
- package/dist/kalada-v1/codec.cjs.map +1 -0
- package/dist/kalada-v1/codec.d.cts +32 -0
- package/dist/kalada-v1/codec.d.ts +32 -0
- package/dist/kalada-v1/codec.js +170 -0
- package/dist/kalada-v1/codec.js.map +1 -0
- package/dist/kalada-v1/compile.cjs +45 -0
- package/dist/kalada-v1/compile.cjs.map +1 -0
- package/dist/kalada-v1/compile.d.cts +8 -0
- package/dist/kalada-v1/compile.d.ts +8 -0
- package/dist/kalada-v1/compile.js +43 -0
- package/dist/kalada-v1/compile.js.map +1 -0
- package/dist/kalada-v1/dependencies.cjs +58 -0
- package/dist/kalada-v1/dependencies.cjs.map +1 -0
- package/dist/kalada-v1/dependencies.d.cts +8 -0
- package/dist/kalada-v1/dependencies.d.ts +8 -0
- package/dist/kalada-v1/dependencies.js +56 -0
- package/dist/kalada-v1/dependencies.js.map +1 -0
- package/dist/kalada-v1/diagnostics.cjs +49 -0
- package/dist/kalada-v1/diagnostics.cjs.map +1 -0
- package/dist/kalada-v1/diagnostics.d.cts +14 -0
- package/dist/kalada-v1/diagnostics.d.ts +14 -0
- package/dist/kalada-v1/diagnostics.js +45 -0
- package/dist/kalada-v1/diagnostics.js.map +1 -0
- package/dist/kalada-v1/evaluate.cjs +176 -0
- package/dist/kalada-v1/evaluate.cjs.map +1 -0
- package/dist/kalada-v1/evaluate.d.cts +8 -0
- package/dist/kalada-v1/evaluate.d.ts +8 -0
- package/dist/kalada-v1/evaluate.js +174 -0
- package/dist/kalada-v1/evaluate.js.map +1 -0
- package/dist/kalada-v1/factories.cjs +66 -0
- package/dist/kalada-v1/factories.cjs.map +1 -0
- package/dist/kalada-v1/factories.d.cts +30 -0
- package/dist/kalada-v1/factories.d.ts +30 -0
- package/dist/kalada-v1/factories.js +64 -0
- package/dist/kalada-v1/factories.js.map +1 -0
- package/dist/kalada-v1/index.cjs +88 -0
- package/dist/kalada-v1/index.cjs.map +1 -0
- package/dist/kalada-v1/index.d.cts +11 -0
- package/dist/kalada-v1/index.d.ts +11 -0
- package/dist/kalada-v1/index.js +11 -0
- package/dist/kalada-v1/index.js.map +1 -0
- package/dist/kalada-v1/json.cjs +129 -0
- package/dist/kalada-v1/json.cjs.map +1 -0
- package/dist/kalada-v1/json.d.cts +20 -0
- package/dist/kalada-v1/json.d.ts +20 -0
- package/dist/kalada-v1/json.js +123 -0
- package/dist/kalada-v1/json.js.map +1 -0
- package/dist/kalada-v1/limits.cjs +34 -0
- package/dist/kalada-v1/limits.cjs.map +1 -0
- package/dist/kalada-v1/limits.d.cts +9 -0
- package/dist/kalada-v1/limits.d.ts +9 -0
- package/dist/kalada-v1/limits.js +31 -0
- package/dist/kalada-v1/limits.js.map +1 -0
- package/dist/kalada-v1/schemas.cjs +182 -0
- package/dist/kalada-v1/schemas.cjs.map +1 -0
- package/dist/kalada-v1/schemas.d.cts +5 -0
- package/dist/kalada-v1/schemas.d.ts +5 -0
- package/dist/kalada-v1/schemas.js +179 -0
- package/dist/kalada-v1/schemas.js.map +1 -0
- package/dist/kalada-v1/temporal-evaluation.cjs +74 -0
- package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -0
- package/dist/kalada-v1/temporal-evaluation.d.cts +13 -0
- package/dist/kalada-v1/temporal-evaluation.d.ts +13 -0
- package/dist/kalada-v1/temporal-evaluation.js +71 -0
- package/dist/kalada-v1/temporal-evaluation.js.map +1 -0
- package/dist/kalada-v1/temporal.cjs +42 -0
- package/dist/kalada-v1/temporal.cjs.map +1 -0
- package/dist/kalada-v1/temporal.d.cts +22 -0
- package/dist/kalada-v1/temporal.d.ts +22 -0
- package/dist/kalada-v1/temporal.js +37 -0
- package/dist/kalada-v1/temporal.js.map +1 -0
- package/dist/kalada-v1/types.cjs +4 -0
- package/dist/kalada-v1/types.cjs.map +1 -0
- package/dist/kalada-v1/types.d.cts +120 -0
- package/dist/kalada-v1/types.d.ts +120 -0
- package/dist/kalada-v1/types.js +3 -0
- package/dist/kalada-v1/types.js.map +1 -0
- package/dist/kalada-v1/values.cjs +112 -0
- package/dist/kalada-v1/values.cjs.map +1 -0
- package/dist/kalada-v1/values.d.cts +49 -0
- package/dist/kalada-v1/values.d.ts +49 -0
- package/dist/kalada-v1/values.js +105 -0
- package/dist/kalada-v1/values.js.map +1 -0
- package/package.json +11 -1
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var limits_js = require('./limits.js');
|
|
4
|
+
|
|
5
|
+
const jsonValue = jsonValueSchema("#/$defs/jsonValue", limits_js.DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);
|
|
6
|
+
const encodedJsonValue = jsonValueSchema(
|
|
7
|
+
"#/$defs/encodedJsonValue",
|
|
8
|
+
limits_js.DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2
|
|
9
|
+
);
|
|
10
|
+
function jsonValueSchema(reference, maxContainerSize) {
|
|
11
|
+
return {
|
|
12
|
+
anyOf: [
|
|
13
|
+
{ type: "null" },
|
|
14
|
+
{ type: "boolean" },
|
|
15
|
+
{ type: "number", minimum: -17976931348623157e292, maximum: 17976931348623157e292 },
|
|
16
|
+
{ type: "string", maxLength: limits_js.DEFAULT_KALADA_V1_LIMITS.maxStringLength },
|
|
17
|
+
{
|
|
18
|
+
type: "array",
|
|
19
|
+
maxItems: maxContainerSize,
|
|
20
|
+
items: { $ref: reference }
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
type: "object",
|
|
24
|
+
maxProperties: maxContainerSize,
|
|
25
|
+
propertyNames: {
|
|
26
|
+
allOf: [
|
|
27
|
+
{ maxLength: limits_js.DEFAULT_KALADA_V1_LIMITS.maxStringLength },
|
|
28
|
+
{ not: { enum: ["__proto__", "constructor", "prototype"] } }
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
additionalProperties: { $ref: reference }
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const expression = {
|
|
37
|
+
oneOf: [
|
|
38
|
+
node("literal", { value: { $ref: "#/$defs/jsonValue" } }, ["value"]),
|
|
39
|
+
node(
|
|
40
|
+
"ref",
|
|
41
|
+
{
|
|
42
|
+
ref: {
|
|
43
|
+
type: "string",
|
|
44
|
+
minLength: 1,
|
|
45
|
+
maxLength: limits_js.DEFAULT_KALADA_V1_LIMITS.maxReferenceLength
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
["ref"]
|
|
49
|
+
),
|
|
50
|
+
node("binding", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [
|
|
51
|
+
"name",
|
|
52
|
+
"value",
|
|
53
|
+
"body"
|
|
54
|
+
]),
|
|
55
|
+
node("option", { variant: { const: "none" } }, ["variant"]),
|
|
56
|
+
node("option", { variant: { const: "some" }, value: expressionRef() }, ["variant", "value"]),
|
|
57
|
+
node("result", { variant: { enum: ["ok", "err"] }, value: expressionRef() }, [
|
|
58
|
+
"variant",
|
|
59
|
+
"value"
|
|
60
|
+
]),
|
|
61
|
+
node("instant", { milliseconds: safeInteger() }, ["milliseconds"]),
|
|
62
|
+
node("duration", { milliseconds: safeInteger() }, ["milliseconds"]),
|
|
63
|
+
node("current-instant", {}, []),
|
|
64
|
+
temporalNode("temporal-arithmetic", ["add", "subtract"]),
|
|
65
|
+
temporalNode("temporal-comparison", [
|
|
66
|
+
"equal",
|
|
67
|
+
"not-equal",
|
|
68
|
+
"less-than",
|
|
69
|
+
"less-than-or-equal",
|
|
70
|
+
"greater-than",
|
|
71
|
+
"greater-than-or-equal"
|
|
72
|
+
]),
|
|
73
|
+
matchNode("Option", [arm("some", true), arm("none", false)]),
|
|
74
|
+
matchNode("Result", [arm("ok", true), arm("err", true)])
|
|
75
|
+
]
|
|
76
|
+
};
|
|
77
|
+
const KALADA_V1_PROGRAM_SCHEMA = deepFreeze({
|
|
78
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
79
|
+
$id: "https://kalada.dev/schema/program/kalada-v1",
|
|
80
|
+
$comment: "The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.",
|
|
81
|
+
type: "object",
|
|
82
|
+
properties: {
|
|
83
|
+
format: { const: "kalada-program" },
|
|
84
|
+
version: { const: 1 },
|
|
85
|
+
profile: { const: "kalada-v1" },
|
|
86
|
+
expression: expressionRef()
|
|
87
|
+
},
|
|
88
|
+
required: ["format", "version", "profile", "expression"],
|
|
89
|
+
additionalProperties: false,
|
|
90
|
+
$defs: { jsonValue, expression }
|
|
91
|
+
});
|
|
92
|
+
const KALADA_VALUE_V1_SCHEMA = deepFreeze({
|
|
93
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
94
|
+
$id: "https://kalada.dev/schema/value/kalada-value-v1",
|
|
95
|
+
$ref: "#/$defs/encodedValue",
|
|
96
|
+
$defs: {
|
|
97
|
+
encodedJsonValue,
|
|
98
|
+
encodedValue: {
|
|
99
|
+
oneOf: [
|
|
100
|
+
valueEnvelope("Json", "value", { $ref: "#/$defs/encodedJsonValue" }),
|
|
101
|
+
valueEnvelope("Option", "none"),
|
|
102
|
+
valueEnvelope("Option", "some", { $ref: "#/$defs/encodedValue" }),
|
|
103
|
+
valueEnvelope("Result", "ok", { $ref: "#/$defs/encodedValue" }),
|
|
104
|
+
valueEnvelope("Result", "err", { $ref: "#/$defs/encodedValue" }),
|
|
105
|
+
valueEnvelope("Instant", "milliseconds", safeInteger()),
|
|
106
|
+
valueEnvelope("Duration", "milliseconds", safeInteger())
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
function node(kind, properties, required) {
|
|
112
|
+
return {
|
|
113
|
+
type: "object",
|
|
114
|
+
properties: { kind: { const: kind }, ...properties },
|
|
115
|
+
required: ["kind", ...required],
|
|
116
|
+
additionalProperties: false
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function temporalNode(kind, operators) {
|
|
120
|
+
return node(
|
|
121
|
+
kind,
|
|
122
|
+
{ operator: { enum: operators }, left: expressionRef(), right: expressionRef() },
|
|
123
|
+
["operator", "left", "right"]
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
function safeInteger() {
|
|
127
|
+
return {
|
|
128
|
+
type: "integer",
|
|
129
|
+
minimum: Number.MIN_SAFE_INTEGER,
|
|
130
|
+
maximum: Number.MAX_SAFE_INTEGER
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function matchNode(type, arms) {
|
|
134
|
+
return node(
|
|
135
|
+
"match",
|
|
136
|
+
{
|
|
137
|
+
type: { const: type },
|
|
138
|
+
value: expressionRef(),
|
|
139
|
+
arms: { type: "array", prefixItems: arms, minItems: 2, maxItems: 2 }
|
|
140
|
+
},
|
|
141
|
+
["type", "value", "arms"]
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
function arm(variant, payload) {
|
|
145
|
+
const properties = {
|
|
146
|
+
variant: { const: variant },
|
|
147
|
+
body: expressionRef()
|
|
148
|
+
};
|
|
149
|
+
if (payload) properties.binding = bindingName();
|
|
150
|
+
return { type: "object", properties, required: ["variant", "body"], additionalProperties: false };
|
|
151
|
+
}
|
|
152
|
+
function valueEnvelope(type, variant, value) {
|
|
153
|
+
const properties = {
|
|
154
|
+
format: { const: "kalada-value" },
|
|
155
|
+
version: { const: 1 },
|
|
156
|
+
type: { const: type },
|
|
157
|
+
variant: { const: variant }
|
|
158
|
+
};
|
|
159
|
+
if (value) properties.value = value;
|
|
160
|
+
return {
|
|
161
|
+
type: "object",
|
|
162
|
+
properties,
|
|
163
|
+
required: Object.keys(properties),
|
|
164
|
+
additionalProperties: false
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function expressionRef() {
|
|
168
|
+
return { $ref: "#/$defs/expression" };
|
|
169
|
+
}
|
|
170
|
+
function bindingName() {
|
|
171
|
+
return { type: "string", minLength: 1, maxLength: limits_js.DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };
|
|
172
|
+
}
|
|
173
|
+
function deepFreeze(value) {
|
|
174
|
+
if (typeof value !== "object" || value === null || Object.isFrozen(value)) return value;
|
|
175
|
+
for (const child of Object.values(value)) deepFreeze(child);
|
|
176
|
+
return Object.freeze(value);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
exports.KALADA_V1_PROGRAM_SCHEMA = KALADA_V1_PROGRAM_SCHEMA;
|
|
180
|
+
exports.KALADA_VALUE_V1_SCHEMA = KALADA_VALUE_V1_SCHEMA;
|
|
181
|
+
//# sourceMappingURL=schemas.cjs.map
|
|
182
|
+
//# sourceMappingURL=schemas.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/schemas.ts"],"names":["DEFAULT_KALADA_V1_LIMITS"],"mappings":"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","file":"schemas.cjs","sourcesContent":["import { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\n\nexport type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;\n\nconst jsonValue = jsonValueSchema(\"#/$defs/jsonValue\", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);\nconst encodedJsonValue = jsonValueSchema(\n \"#/$defs/encodedJsonValue\",\n DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2,\n);\n\nfunction jsonValueSchema(reference: string, maxContainerSize: number): Record<string, unknown> {\n return {\n anyOf: [\n { type: \"null\" },\n { type: \"boolean\" },\n { type: \"number\", minimum: -1.7976931348623157e308, maximum: 1.7976931348623157e308 },\n { type: \"string\", maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n {\n type: \"array\",\n maxItems: maxContainerSize,\n items: { $ref: reference },\n },\n {\n type: \"object\",\n maxProperties: maxContainerSize,\n propertyNames: {\n allOf: [\n { maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n { not: { enum: [\"__proto__\", \"constructor\", \"prototype\"] } },\n ],\n },\n additionalProperties: { $ref: reference },\n },\n ],\n };\n}\n\nconst expression = {\n oneOf: [\n node(\"literal\", { value: { $ref: \"#/$defs/jsonValue\" } }, [\"value\"]),\n node(\n \"ref\",\n {\n ref: {\n type: \"string\",\n minLength: 1,\n maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength,\n },\n },\n [\"ref\"],\n ),\n node(\"binding\", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [\n \"name\",\n \"value\",\n \"body\",\n ]),\n node(\"option\", { variant: { const: \"none\" } }, [\"variant\"]),\n node(\"option\", { variant: { const: \"some\" }, value: expressionRef() }, [\"variant\", \"value\"]),\n node(\"result\", { variant: { enum: [\"ok\", \"err\"] }, value: expressionRef() }, [\n \"variant\",\n \"value\",\n ]),\n node(\"instant\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"duration\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"current-instant\", {}, []),\n temporalNode(\"temporal-arithmetic\", [\"add\", \"subtract\"]),\n temporalNode(\"temporal-comparison\", [\n \"equal\",\n \"not-equal\",\n \"less-than\",\n \"less-than-or-equal\",\n \"greater-than\",\n \"greater-than-or-equal\",\n ]),\n matchNode(\"Option\", [arm(\"some\", true), arm(\"none\", false)]),\n matchNode(\"Result\", [arm(\"ok\", true), arm(\"err\", true)]),\n ],\n};\n\nexport const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: { jsonValue, expression },\n});\n\nexport const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/value/kalada-value-v1\",\n $ref: \"#/$defs/encodedValue\",\n $defs: {\n encodedJsonValue,\n encodedValue: {\n oneOf: [\n valueEnvelope(\"Json\", \"value\", { $ref: \"#/$defs/encodedJsonValue\" }),\n valueEnvelope(\"Option\", \"none\"),\n valueEnvelope(\"Option\", \"some\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"ok\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"err\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Instant\", \"milliseconds\", safeInteger()),\n valueEnvelope(\"Duration\", \"milliseconds\", safeInteger()),\n ],\n },\n },\n});\n\nfunction node(\n kind: string,\n properties: Record<string, unknown>,\n required: string[],\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties: { kind: { const: kind }, ...properties },\n required: [\"kind\", ...required],\n additionalProperties: false,\n };\n}\n\nfunction temporalNode(kind: string, operators: readonly string[]): Record<string, unknown> {\n return node(\n kind,\n { operator: { enum: operators }, left: expressionRef(), right: expressionRef() },\n [\"operator\", \"left\", \"right\"],\n );\n}\n\nfunction safeInteger(): Record<string, unknown> {\n return {\n type: \"integer\",\n minimum: Number.MIN_SAFE_INTEGER,\n maximum: Number.MAX_SAFE_INTEGER,\n };\n}\n\nfunction matchNode(\n type: \"Option\" | \"Result\",\n arms: readonly Record<string, unknown>[],\n): Record<string, unknown> {\n return node(\n \"match\",\n {\n type: { const: type },\n value: expressionRef(),\n arms: { type: \"array\", prefixItems: arms, minItems: 2, maxItems: 2 },\n },\n [\"type\", \"value\", \"arms\"],\n );\n}\n\nfunction arm(variant: string, payload: boolean): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n variant: { const: variant },\n body: expressionRef(),\n };\n if (payload) properties.binding = bindingName();\n return { type: \"object\", properties, required: [\"variant\", \"body\"], additionalProperties: false };\n}\n\nfunction valueEnvelope(\n type: string,\n variant: string,\n value?: Record<string, unknown>,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n format: { const: \"kalada-value\" },\n version: { const: 1 },\n type: { const: type },\n variant: { const: variant },\n };\n if (value) properties.value = value;\n return {\n type: \"object\",\n properties,\n required: Object.keys(properties),\n additionalProperties: false,\n };\n}\n\nfunction expressionRef(): Record<string, string> {\n return { $ref: \"#/$defs/expression\" };\n}\n\nfunction bindingName(): Record<string, unknown> {\n return { type: \"string\", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const child of Object.values(value)) deepFreeze(child);\n return Object.freeze(value);\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;
|
|
2
|
+
declare const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema;
|
|
3
|
+
declare const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema;
|
|
4
|
+
|
|
5
|
+
export { KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA, type KaladaV1JsonSchema };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;
|
|
2
|
+
declare const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema;
|
|
3
|
+
declare const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema;
|
|
4
|
+
|
|
5
|
+
export { KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA, type KaladaV1JsonSchema };
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { DEFAULT_KALADA_V1_LIMITS } from './limits.js';
|
|
2
|
+
|
|
3
|
+
const jsonValue = jsonValueSchema("#/$defs/jsonValue", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);
|
|
4
|
+
const encodedJsonValue = jsonValueSchema(
|
|
5
|
+
"#/$defs/encodedJsonValue",
|
|
6
|
+
DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2
|
|
7
|
+
);
|
|
8
|
+
function jsonValueSchema(reference, maxContainerSize) {
|
|
9
|
+
return {
|
|
10
|
+
anyOf: [
|
|
11
|
+
{ type: "null" },
|
|
12
|
+
{ type: "boolean" },
|
|
13
|
+
{ type: "number", minimum: -17976931348623157e292, maximum: 17976931348623157e292 },
|
|
14
|
+
{ type: "string", maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },
|
|
15
|
+
{
|
|
16
|
+
type: "array",
|
|
17
|
+
maxItems: maxContainerSize,
|
|
18
|
+
items: { $ref: reference }
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
type: "object",
|
|
22
|
+
maxProperties: maxContainerSize,
|
|
23
|
+
propertyNames: {
|
|
24
|
+
allOf: [
|
|
25
|
+
{ maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },
|
|
26
|
+
{ not: { enum: ["__proto__", "constructor", "prototype"] } }
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
additionalProperties: { $ref: reference }
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const expression = {
|
|
35
|
+
oneOf: [
|
|
36
|
+
node("literal", { value: { $ref: "#/$defs/jsonValue" } }, ["value"]),
|
|
37
|
+
node(
|
|
38
|
+
"ref",
|
|
39
|
+
{
|
|
40
|
+
ref: {
|
|
41
|
+
type: "string",
|
|
42
|
+
minLength: 1,
|
|
43
|
+
maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
["ref"]
|
|
47
|
+
),
|
|
48
|
+
node("binding", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [
|
|
49
|
+
"name",
|
|
50
|
+
"value",
|
|
51
|
+
"body"
|
|
52
|
+
]),
|
|
53
|
+
node("option", { variant: { const: "none" } }, ["variant"]),
|
|
54
|
+
node("option", { variant: { const: "some" }, value: expressionRef() }, ["variant", "value"]),
|
|
55
|
+
node("result", { variant: { enum: ["ok", "err"] }, value: expressionRef() }, [
|
|
56
|
+
"variant",
|
|
57
|
+
"value"
|
|
58
|
+
]),
|
|
59
|
+
node("instant", { milliseconds: safeInteger() }, ["milliseconds"]),
|
|
60
|
+
node("duration", { milliseconds: safeInteger() }, ["milliseconds"]),
|
|
61
|
+
node("current-instant", {}, []),
|
|
62
|
+
temporalNode("temporal-arithmetic", ["add", "subtract"]),
|
|
63
|
+
temporalNode("temporal-comparison", [
|
|
64
|
+
"equal",
|
|
65
|
+
"not-equal",
|
|
66
|
+
"less-than",
|
|
67
|
+
"less-than-or-equal",
|
|
68
|
+
"greater-than",
|
|
69
|
+
"greater-than-or-equal"
|
|
70
|
+
]),
|
|
71
|
+
matchNode("Option", [arm("some", true), arm("none", false)]),
|
|
72
|
+
matchNode("Result", [arm("ok", true), arm("err", true)])
|
|
73
|
+
]
|
|
74
|
+
};
|
|
75
|
+
const KALADA_V1_PROGRAM_SCHEMA = deepFreeze({
|
|
76
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
77
|
+
$id: "https://kalada.dev/schema/program/kalada-v1",
|
|
78
|
+
$comment: "The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.",
|
|
79
|
+
type: "object",
|
|
80
|
+
properties: {
|
|
81
|
+
format: { const: "kalada-program" },
|
|
82
|
+
version: { const: 1 },
|
|
83
|
+
profile: { const: "kalada-v1" },
|
|
84
|
+
expression: expressionRef()
|
|
85
|
+
},
|
|
86
|
+
required: ["format", "version", "profile", "expression"],
|
|
87
|
+
additionalProperties: false,
|
|
88
|
+
$defs: { jsonValue, expression }
|
|
89
|
+
});
|
|
90
|
+
const KALADA_VALUE_V1_SCHEMA = deepFreeze({
|
|
91
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
92
|
+
$id: "https://kalada.dev/schema/value/kalada-value-v1",
|
|
93
|
+
$ref: "#/$defs/encodedValue",
|
|
94
|
+
$defs: {
|
|
95
|
+
encodedJsonValue,
|
|
96
|
+
encodedValue: {
|
|
97
|
+
oneOf: [
|
|
98
|
+
valueEnvelope("Json", "value", { $ref: "#/$defs/encodedJsonValue" }),
|
|
99
|
+
valueEnvelope("Option", "none"),
|
|
100
|
+
valueEnvelope("Option", "some", { $ref: "#/$defs/encodedValue" }),
|
|
101
|
+
valueEnvelope("Result", "ok", { $ref: "#/$defs/encodedValue" }),
|
|
102
|
+
valueEnvelope("Result", "err", { $ref: "#/$defs/encodedValue" }),
|
|
103
|
+
valueEnvelope("Instant", "milliseconds", safeInteger()),
|
|
104
|
+
valueEnvelope("Duration", "milliseconds", safeInteger())
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
function node(kind, properties, required) {
|
|
110
|
+
return {
|
|
111
|
+
type: "object",
|
|
112
|
+
properties: { kind: { const: kind }, ...properties },
|
|
113
|
+
required: ["kind", ...required],
|
|
114
|
+
additionalProperties: false
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function temporalNode(kind, operators) {
|
|
118
|
+
return node(
|
|
119
|
+
kind,
|
|
120
|
+
{ operator: { enum: operators }, left: expressionRef(), right: expressionRef() },
|
|
121
|
+
["operator", "left", "right"]
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
function safeInteger() {
|
|
125
|
+
return {
|
|
126
|
+
type: "integer",
|
|
127
|
+
minimum: Number.MIN_SAFE_INTEGER,
|
|
128
|
+
maximum: Number.MAX_SAFE_INTEGER
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function matchNode(type, arms) {
|
|
132
|
+
return node(
|
|
133
|
+
"match",
|
|
134
|
+
{
|
|
135
|
+
type: { const: type },
|
|
136
|
+
value: expressionRef(),
|
|
137
|
+
arms: { type: "array", prefixItems: arms, minItems: 2, maxItems: 2 }
|
|
138
|
+
},
|
|
139
|
+
["type", "value", "arms"]
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
function arm(variant, payload) {
|
|
143
|
+
const properties = {
|
|
144
|
+
variant: { const: variant },
|
|
145
|
+
body: expressionRef()
|
|
146
|
+
};
|
|
147
|
+
if (payload) properties.binding = bindingName();
|
|
148
|
+
return { type: "object", properties, required: ["variant", "body"], additionalProperties: false };
|
|
149
|
+
}
|
|
150
|
+
function valueEnvelope(type, variant, value) {
|
|
151
|
+
const properties = {
|
|
152
|
+
format: { const: "kalada-value" },
|
|
153
|
+
version: { const: 1 },
|
|
154
|
+
type: { const: type },
|
|
155
|
+
variant: { const: variant }
|
|
156
|
+
};
|
|
157
|
+
if (value) properties.value = value;
|
|
158
|
+
return {
|
|
159
|
+
type: "object",
|
|
160
|
+
properties,
|
|
161
|
+
required: Object.keys(properties),
|
|
162
|
+
additionalProperties: false
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function expressionRef() {
|
|
166
|
+
return { $ref: "#/$defs/expression" };
|
|
167
|
+
}
|
|
168
|
+
function bindingName() {
|
|
169
|
+
return { type: "string", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };
|
|
170
|
+
}
|
|
171
|
+
function deepFreeze(value) {
|
|
172
|
+
if (typeof value !== "object" || value === null || Object.isFrozen(value)) return value;
|
|
173
|
+
for (const child of Object.values(value)) deepFreeze(child);
|
|
174
|
+
return Object.freeze(value);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export { KALADA_V1_PROGRAM_SCHEMA, KALADA_VALUE_V1_SCHEMA };
|
|
178
|
+
//# sourceMappingURL=schemas.js.map
|
|
179
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/schemas.ts"],"names":[],"mappings":";;AAIA,MAAM,SAAA,GAAY,eAAA,CAAgB,mBAAA,EAAqB,wBAAA,CAAyB,gBAAgB,CAAC,CAAA;AACjG,MAAM,gBAAA,GAAmB,eAAA;AAAA,EACvB,0BAAA;AAAA,EACA,yBAAyB,aAAA,GAAgB;AAC3C,CAAA;AAEA,SAAS,eAAA,CAAgB,WAAmB,gBAAA,EAAmD;AAC7F,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,MAAA,EAAO;AAAA,MACf,EAAE,MAAM,SAAA,EAAU;AAAA,MAClB,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,sBAAA,EAAyB,SAAS,qBAAA,EAAuB;AAAA,MACpF,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,yBAAyB,eAAA,EAAgB;AAAA,MACtE;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,QAAA,EAAU,gBAAA;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA;AAAU,OAC3B;AAAA,MACA;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,aAAA,EAAe,gBAAA;AAAA,QACf,aAAA,EAAe;AAAA,UACb,KAAA,EAAO;AAAA,YACL,EAAE,SAAA,EAAW,wBAAA,CAAyB,eAAA,EAAgB;AAAA,YACtD,EAAE,KAAK,EAAE,IAAA,EAAM,CAAC,WAAA,EAAa,aAAA,EAAe,WAAW,CAAA,EAAE;AAAE;AAC7D,SACF;AAAA,QACA,oBAAA,EAAsB,EAAE,IAAA,EAAM,SAAA;AAAU;AAC1C;AACF,GACF;AACF;AAEA,MAAM,UAAA,GAAa;AAAA,EACjB,KAAA,EAAO;AAAA,IACL,IAAA,CAAK,SAAA,EAAW,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,mBAAA,EAAoB,EAAE,EAAG,CAAC,OAAO,CAAC,CAAA;AAAA,IACnE,IAAA;AAAA,MACE,KAAA;AAAA,MACA;AAAA,QACE,GAAA,EAAK;AAAA,UACH,IAAA,EAAM,QAAA;AAAA,UACN,SAAA,EAAW,CAAA;AAAA,UACX,WAAW,wBAAA,CAAyB;AAAA;AACtC,OACF;AAAA,MACA,CAAC,KAAK;AAAA,KACR;AAAA,IACA,IAAA,CAAK,SAAA,EAAW,EAAE,IAAA,EAAM,WAAA,EAAY,EAAG,KAAA,EAAO,aAAA,EAAc,EAAG,IAAA,EAAM,aAAA,EAAc,EAAE,EAAG;AAAA,MACtF,MAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD,IAAA,CAAK,QAAA,EAAU,EAAE,OAAA,EAAS,EAAE,KAAA,EAAO,MAAA,EAAO,EAAE,EAAG,CAAC,SAAS,CAAC,CAAA;AAAA,IAC1D,IAAA,CAAK,QAAA,EAAU,EAAE,OAAA,EAAS,EAAE,KAAA,EAAO,MAAA,EAAO,EAAG,KAAA,EAAO,eAAc,EAAE,EAAG,CAAC,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,IAC3F,IAAA,CAAK,QAAA,EAAU,EAAE,OAAA,EAAS,EAAE,IAAA,EAAM,CAAC,IAAA,EAAM,KAAK,CAAA,EAAE,EAAG,KAAA,EAAO,aAAA,IAAgB,EAAG;AAAA,MAC3E,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD,IAAA,CAAK,WAAW,EAAE,YAAA,EAAc,aAAY,EAAE,EAAG,CAAC,cAAc,CAAC,CAAA;AAAA,IACjE,IAAA,CAAK,YAAY,EAAE,YAAA,EAAc,aAAY,EAAE,EAAG,CAAC,cAAc,CAAC,CAAA;AAAA,IAClE,IAAA,CAAK,iBAAA,EAAmB,EAAC,EAAG,EAAE,CAAA;AAAA,IAC9B,YAAA,CAAa,qBAAA,EAAuB,CAAC,KAAA,EAAO,UAAU,CAAC,CAAA;AAAA,IACvD,aAAa,qBAAA,EAAuB;AAAA,MAClC,OAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,oBAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD,SAAA,CAAU,QAAA,EAAU,CAAC,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA,EAAG,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAC,CAAC,CAAA;AAAA,IAC3D,SAAA,CAAU,QAAA,EAAU,CAAC,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA,EAAG,GAAA,CAAI,KAAA,EAAO,IAAI,CAAC,CAAC;AAAA;AAE3D,CAAA;AAEO,MAAM,2BAA+C,UAAA,CAAW;AAAA,EACrE,OAAA,EAAS,8CAAA;AAAA,EACT,GAAA,EAAK,6CAAA;AAAA,EACL,QAAA,EACE,wKAAA;AAAA,EACF,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,MAAA,EAAQ,EAAE,KAAA,EAAO,gBAAA,EAAiB;AAAA,IAClC,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,IACpB,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAY;AAAA,IAC9B,YAAY,aAAA;AAAc,GAC5B;AAAA,EACA,QAAA,EAAU,CAAC,QAAA,EAAU,SAAA,EAAW,WAAW,YAAY,CAAA;AAAA,EACvD,oBAAA,EAAsB,KAAA;AAAA,EACtB,KAAA,EAAO,EAAE,SAAA,EAAW,UAAA;AACtB,CAAC;AAEM,MAAM,yBAA6C,UAAA,CAAW;AAAA,EACnE,OAAA,EAAS,8CAAA;AAAA,EACT,GAAA,EAAK,iDAAA;AAAA,EACL,IAAA,EAAM,sBAAA;AAAA,EACN,KAAA,EAAO;AAAA,IACL,gBAAA;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,cAAc,MAAA,EAAQ,OAAA,EAAS,EAAE,IAAA,EAAM,4BAA4B,CAAA;AAAA,QACnE,aAAA,CAAc,UAAU,MAAM,CAAA;AAAA,QAC9B,cAAc,QAAA,EAAU,MAAA,EAAQ,EAAE,IAAA,EAAM,wBAAwB,CAAA;AAAA,QAChE,cAAc,QAAA,EAAU,IAAA,EAAM,EAAE,IAAA,EAAM,wBAAwB,CAAA;AAAA,QAC9D,cAAc,QAAA,EAAU,KAAA,EAAO,EAAE,IAAA,EAAM,wBAAwB,CAAA;AAAA,QAC/D,aAAA,CAAc,SAAA,EAAW,cAAA,EAAgB,WAAA,EAAa,CAAA;AAAA,QACtD,aAAA,CAAc,UAAA,EAAY,cAAA,EAAgB,WAAA,EAAa;AAAA;AACzD;AACF;AAEJ,CAAC;AAED,SAAS,IAAA,CACP,IAAA,EACA,UAAA,EACA,QAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY,EAAE,IAAA,EAAM,EAAE,OAAO,IAAA,EAAK,EAAG,GAAG,UAAA,EAAW;AAAA,IACnD,QAAA,EAAU,CAAC,MAAA,EAAQ,GAAG,QAAQ,CAAA;AAAA,IAC9B,oBAAA,EAAsB;AAAA,GACxB;AACF;AAEA,SAAS,YAAA,CAAa,MAAc,SAAA,EAAuD;AACzF,EAAA,OAAO,IAAA;AAAA,IACL,IAAA;AAAA,IACA,EAAE,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAU,EAAG,IAAA,EAAM,aAAA,EAAc,EAAG,KAAA,EAAO,aAAA,EAAc,EAAE;AAAA,IAC/E,CAAC,UAAA,EAAY,MAAA,EAAQ,OAAO;AAAA,GAC9B;AACF;AAEA,SAAS,WAAA,GAAuC;AAC9C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,SAAS,MAAA,CAAO,gBAAA;AAAA,IAChB,SAAS,MAAA,CAAO;AAAA,GAClB;AACF;AAEA,SAAS,SAAA,CACP,MACA,IAAA,EACyB;AACzB,EAAA,OAAO,IAAA;AAAA,IACL,OAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,MACpB,OAAO,aAAA,EAAc;AAAA,MACrB,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,aAAa,IAAA,EAAM,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,CAAA;AAAE,KACrE;AAAA,IACA,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAM;AAAA,GAC1B;AACF;AAEA,SAAS,GAAA,CAAI,SAAiB,OAAA,EAA2C;AACvE,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA,EAAQ;AAAA,IAC1B,MAAM,aAAA;AAAc,GACtB;AACA,EAAA,IAAI,OAAA,EAAS,UAAA,CAAW,OAAA,GAAU,WAAA,EAAY;AAC9C,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,CAAC,SAAA,EAAW,MAAM,CAAA,EAAG,oBAAA,EAAsB,KAAA,EAAM;AAClG;AAEA,SAAS,aAAA,CACP,IAAA,EACA,OAAA,EACA,KAAA,EACyB;AACzB,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,MAAA,EAAQ,EAAE,KAAA,EAAO,cAAA,EAAe;AAAA,IAChC,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,IACpB,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,IACpB,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA;AAAQ,GAC5B;AACA,EAAA,IAAI,KAAA,aAAkB,KAAA,GAAQ,KAAA;AAC9B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,UAAA;AAAA,IACA,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,IAChC,oBAAA,EAAsB;AAAA,GACxB;AACF;AAEA,SAAS,aAAA,GAAwC;AAC/C,EAAA,OAAO,EAAE,MAAM,oBAAA,EAAqB;AACtC;AAEA,SAAS,WAAA,GAAuC;AAC9C,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,CAAA,EAAG,SAAA,EAAW,yBAAyB,kBAAA,EAAmB;AAChG;AAEA,SAAS,WAAc,KAAA,EAAa;AAClC,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAClF,EAAA,KAAA,MAAW,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,aAAc,KAAK,CAAA;AAC1D,EAAA,OAAO,MAAA,CAAO,OAAO,KAAK,CAAA;AAC5B","file":"schemas.js","sourcesContent":["import { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\n\nexport type KaladaV1JsonSchema = Readonly<Record<string, unknown>>;\n\nconst jsonValue = jsonValueSchema(\"#/$defs/jsonValue\", DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 1);\nconst encodedJsonValue = jsonValueSchema(\n \"#/$defs/encodedJsonValue\",\n DEFAULT_KALADA_V1_LIMITS.maxValueNodes - 2,\n);\n\nfunction jsonValueSchema(reference: string, maxContainerSize: number): Record<string, unknown> {\n return {\n anyOf: [\n { type: \"null\" },\n { type: \"boolean\" },\n { type: \"number\", minimum: -1.7976931348623157e308, maximum: 1.7976931348623157e308 },\n { type: \"string\", maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n {\n type: \"array\",\n maxItems: maxContainerSize,\n items: { $ref: reference },\n },\n {\n type: \"object\",\n maxProperties: maxContainerSize,\n propertyNames: {\n allOf: [\n { maxLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength },\n { not: { enum: [\"__proto__\", \"constructor\", \"prototype\"] } },\n ],\n },\n additionalProperties: { $ref: reference },\n },\n ],\n };\n}\n\nconst expression = {\n oneOf: [\n node(\"literal\", { value: { $ref: \"#/$defs/jsonValue\" } }, [\"value\"]),\n node(\n \"ref\",\n {\n ref: {\n type: \"string\",\n minLength: 1,\n maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength,\n },\n },\n [\"ref\"],\n ),\n node(\"binding\", { name: bindingName(), value: expressionRef(), body: expressionRef() }, [\n \"name\",\n \"value\",\n \"body\",\n ]),\n node(\"option\", { variant: { const: \"none\" } }, [\"variant\"]),\n node(\"option\", { variant: { const: \"some\" }, value: expressionRef() }, [\"variant\", \"value\"]),\n node(\"result\", { variant: { enum: [\"ok\", \"err\"] }, value: expressionRef() }, [\n \"variant\",\n \"value\",\n ]),\n node(\"instant\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"duration\", { milliseconds: safeInteger() }, [\"milliseconds\"]),\n node(\"current-instant\", {}, []),\n temporalNode(\"temporal-arithmetic\", [\"add\", \"subtract\"]),\n temporalNode(\"temporal-comparison\", [\n \"equal\",\n \"not-equal\",\n \"less-than\",\n \"less-than-or-equal\",\n \"greater-than\",\n \"greater-than-or-equal\",\n ]),\n matchNode(\"Option\", [arm(\"some\", true), arm(\"none\", false)]),\n matchNode(\"Result\", [arm(\"ok\", true), arm(\"err\", true)]),\n ],\n};\n\nexport const KALADA_V1_PROGRAM_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/program/kalada-v1\",\n $comment:\n \"The schema enforces canonical shape and local string/container bounds. Aggregate AST depth, AST nodes, value nodes, and evaluation steps remain runtime-authoritative.\",\n type: \"object\",\n properties: {\n format: { const: \"kalada-program\" },\n version: { const: 1 },\n profile: { const: \"kalada-v1\" },\n expression: expressionRef(),\n },\n required: [\"format\", \"version\", \"profile\", \"expression\"],\n additionalProperties: false,\n $defs: { jsonValue, expression },\n});\n\nexport const KALADA_VALUE_V1_SCHEMA: KaladaV1JsonSchema = deepFreeze({\n $schema: \"https://json-schema.org/draft/2020-12/schema\",\n $id: \"https://kalada.dev/schema/value/kalada-value-v1\",\n $ref: \"#/$defs/encodedValue\",\n $defs: {\n encodedJsonValue,\n encodedValue: {\n oneOf: [\n valueEnvelope(\"Json\", \"value\", { $ref: \"#/$defs/encodedJsonValue\" }),\n valueEnvelope(\"Option\", \"none\"),\n valueEnvelope(\"Option\", \"some\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"ok\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Result\", \"err\", { $ref: \"#/$defs/encodedValue\" }),\n valueEnvelope(\"Instant\", \"milliseconds\", safeInteger()),\n valueEnvelope(\"Duration\", \"milliseconds\", safeInteger()),\n ],\n },\n },\n});\n\nfunction node(\n kind: string,\n properties: Record<string, unknown>,\n required: string[],\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties: { kind: { const: kind }, ...properties },\n required: [\"kind\", ...required],\n additionalProperties: false,\n };\n}\n\nfunction temporalNode(kind: string, operators: readonly string[]): Record<string, unknown> {\n return node(\n kind,\n { operator: { enum: operators }, left: expressionRef(), right: expressionRef() },\n [\"operator\", \"left\", \"right\"],\n );\n}\n\nfunction safeInteger(): Record<string, unknown> {\n return {\n type: \"integer\",\n minimum: Number.MIN_SAFE_INTEGER,\n maximum: Number.MAX_SAFE_INTEGER,\n };\n}\n\nfunction matchNode(\n type: \"Option\" | \"Result\",\n arms: readonly Record<string, unknown>[],\n): Record<string, unknown> {\n return node(\n \"match\",\n {\n type: { const: type },\n value: expressionRef(),\n arms: { type: \"array\", prefixItems: arms, minItems: 2, maxItems: 2 },\n },\n [\"type\", \"value\", \"arms\"],\n );\n}\n\nfunction arm(variant: string, payload: boolean): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n variant: { const: variant },\n body: expressionRef(),\n };\n if (payload) properties.binding = bindingName();\n return { type: \"object\", properties, required: [\"variant\", \"body\"], additionalProperties: false };\n}\n\nfunction valueEnvelope(\n type: string,\n variant: string,\n value?: Record<string, unknown>,\n): Record<string, unknown> {\n const properties: Record<string, unknown> = {\n format: { const: \"kalada-value\" },\n version: { const: 1 },\n type: { const: type },\n variant: { const: variant },\n };\n if (value) properties.value = value;\n return {\n type: \"object\",\n properties,\n required: Object.keys(properties),\n additionalProperties: false,\n };\n}\n\nfunction expressionRef(): Record<string, string> {\n return { $ref: \"#/$defs/expression\" };\n}\n\nfunction bindingName(): Record<string, unknown> {\n return { type: \"string\", minLength: 1, maxLength: DEFAULT_KALADA_V1_LIMITS.maxReferenceLength };\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n for (const child of Object.values(value)) deepFreeze(child);\n return Object.freeze(value);\n}\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var diagnostics_js = require('./diagnostics.js');
|
|
4
|
+
var temporal_js = require('./temporal.js');
|
|
5
|
+
|
|
6
|
+
function isTemporalExpression(node) {
|
|
7
|
+
return node.kind === "instant" || node.kind === "duration" || node.kind === "current-instant" || node.kind === "temporal-arithmetic" || node.kind === "temporal-comparison";
|
|
8
|
+
}
|
|
9
|
+
function evaluateTemporalExpression(node, path, instant, evaluate) {
|
|
10
|
+
if (node.kind === "instant") return temporal_js.Instant.fromMilliseconds(node.milliseconds);
|
|
11
|
+
if (node.kind === "duration") return temporal_js.Duration.fromMilliseconds(node.milliseconds);
|
|
12
|
+
if (node.kind === "current-instant") {
|
|
13
|
+
if (!instant) throw new diagnostics_js.KaladaFailure("KALADA_INSTANT_REQUIRED", path);
|
|
14
|
+
return instant;
|
|
15
|
+
}
|
|
16
|
+
const left = temporalOperand(evaluate, node.left, [...path, "left"]);
|
|
17
|
+
const right = temporalOperand(evaluate, node.right, [...path, "right"]);
|
|
18
|
+
if (node.kind === "temporal-comparison") {
|
|
19
|
+
assertSameType(left, right, [...path, "right"]);
|
|
20
|
+
return compare(node.operator, left.milliseconds, right.milliseconds);
|
|
21
|
+
}
|
|
22
|
+
return node.operator === "add" ? add(left, right, [...path, "right"]) : subtract(left, right, [...path, "right"]);
|
|
23
|
+
}
|
|
24
|
+
function temporalOperand(evaluate, node, path) {
|
|
25
|
+
const value = evaluate(node, path);
|
|
26
|
+
if (!temporal_js.isInstant(value) && !temporal_js.isDuration(value)) mismatch(path);
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
function add(left, right, path) {
|
|
30
|
+
if (temporal_js.isInstant(left) && temporal_js.isDuration(right)) {
|
|
31
|
+
return temporal_js.Instant.fromMilliseconds(checked(left.milliseconds + right.milliseconds, path));
|
|
32
|
+
}
|
|
33
|
+
if (temporal_js.isDuration(left) && temporal_js.isDuration(right)) {
|
|
34
|
+
return temporal_js.Duration.fromMilliseconds(checked(left.milliseconds + right.milliseconds, path));
|
|
35
|
+
}
|
|
36
|
+
return mismatch(path);
|
|
37
|
+
}
|
|
38
|
+
function subtract(left, right, path) {
|
|
39
|
+
if (temporal_js.isInstant(left) && temporal_js.isInstant(right)) {
|
|
40
|
+
return temporal_js.Duration.fromMilliseconds(checked(left.milliseconds - right.milliseconds, path));
|
|
41
|
+
}
|
|
42
|
+
if (temporal_js.isInstant(left) && temporal_js.isDuration(right)) {
|
|
43
|
+
return temporal_js.Instant.fromMilliseconds(checked(left.milliseconds - right.milliseconds, path));
|
|
44
|
+
}
|
|
45
|
+
if (temporal_js.isDuration(left) && temporal_js.isDuration(right)) {
|
|
46
|
+
return temporal_js.Duration.fromMilliseconds(checked(left.milliseconds - right.milliseconds, path));
|
|
47
|
+
}
|
|
48
|
+
return mismatch(path);
|
|
49
|
+
}
|
|
50
|
+
function assertSameType(left, right, path) {
|
|
51
|
+
if (temporal_js.isInstant(left) && !temporal_js.isInstant(right) || temporal_js.isDuration(left) && !temporal_js.isDuration(right)) {
|
|
52
|
+
mismatch(path);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function compare(operator, left, right) {
|
|
56
|
+
if (operator === "equal") return left === right;
|
|
57
|
+
if (operator === "not-equal") return left !== right;
|
|
58
|
+
if (operator === "less-than") return left < right;
|
|
59
|
+
if (operator === "less-than-or-equal") return left <= right;
|
|
60
|
+
if (operator === "greater-than") return left > right;
|
|
61
|
+
return left >= right;
|
|
62
|
+
}
|
|
63
|
+
function checked(output, path) {
|
|
64
|
+
if (!Number.isSafeInteger(output)) throw new diagnostics_js.KaladaFailure("KALADA_TEMPORAL_OVERFLOW", path);
|
|
65
|
+
return Object.is(output, -0) ? 0 : output;
|
|
66
|
+
}
|
|
67
|
+
function mismatch(path) {
|
|
68
|
+
throw new diagnostics_js.KaladaFailure("KALADA_TEMPORAL_TYPE_MISMATCH", path);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
exports.evaluateTemporalExpression = evaluateTemporalExpression;
|
|
72
|
+
exports.isTemporalExpression = isTemporalExpression;
|
|
73
|
+
//# sourceMappingURL=temporal-evaluation.cjs.map
|
|
74
|
+
//# sourceMappingURL=temporal-evaluation.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/temporal-evaluation.ts"],"names":["Instant","Duration","KaladaFailure","isInstant","isDuration"],"mappings":"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","file":"temporal-evaluation.cjs","sourcesContent":["import { KaladaFailure } from \"./diagnostics.js\";\nimport type { JsonValue } from \"./json.js\";\nimport {\n Duration,\n type DurationValue,\n Instant,\n type InstantValue,\n isDuration,\n isInstant,\n} from \"./temporal.js\";\nimport type { KaladaV1Expression } from \"./types.js\";\nimport type { KaladaValue } from \"./values.js\";\n\ntype Path = readonly (string | number)[];\ntype TemporalExpression<R extends JsonValue> = Extract<\n KaladaV1Expression<R>,\n { kind: \"instant\" | \"duration\" | \"current-instant\" | `temporal-${string}` }\n>;\ntype TemporalValue = InstantValue | DurationValue;\n\nexport function isTemporalExpression<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n): node is TemporalExpression<R> {\n return (\n node.kind === \"instant\" ||\n node.kind === \"duration\" ||\n node.kind === \"current-instant\" ||\n node.kind === \"temporal-arithmetic\" ||\n node.kind === \"temporal-comparison\"\n );\n}\n\nexport function evaluateTemporalExpression<R extends JsonValue>(\n node: TemporalExpression<R>,\n path: Path,\n instant: InstantValue | undefined,\n evaluate: (node: KaladaV1Expression<R>, path: Path) => KaladaValue,\n): KaladaValue {\n if (node.kind === \"instant\") return Instant.fromMilliseconds(node.milliseconds);\n if (node.kind === \"duration\") return Duration.fromMilliseconds(node.milliseconds);\n if (node.kind === \"current-instant\") {\n if (!instant) throw new KaladaFailure(\"KALADA_INSTANT_REQUIRED\", path);\n return instant;\n }\n const left = temporalOperand(evaluate, node.left, [...path, \"left\"]);\n const right = temporalOperand(evaluate, node.right, [...path, \"right\"]);\n if (node.kind === \"temporal-comparison\") {\n assertSameType(left, right, [...path, \"right\"]);\n return compare(node.operator, left.milliseconds, right.milliseconds);\n }\n return node.operator === \"add\"\n ? add(left, right, [...path, \"right\"])\n : subtract(left, right, [...path, \"right\"]);\n}\n\nfunction temporalOperand<R extends JsonValue>(\n evaluate: (node: KaladaV1Expression<R>, path: Path) => KaladaValue,\n node: KaladaV1Expression<R>,\n path: Path,\n): TemporalValue {\n const value = evaluate(node, path);\n if (!isInstant(value) && !isDuration(value)) mismatch(path);\n return value;\n}\n\nfunction add(left: TemporalValue, right: TemporalValue, path: Path): TemporalValue {\n if (isInstant(left) && isDuration(right)) {\n return Instant.fromMilliseconds(checked(left.milliseconds + right.milliseconds, path));\n }\n if (isDuration(left) && isDuration(right)) {\n return Duration.fromMilliseconds(checked(left.milliseconds + right.milliseconds, path));\n }\n return mismatch(path);\n}\n\nfunction subtract(left: TemporalValue, right: TemporalValue, path: Path): TemporalValue {\n if (isInstant(left) && isInstant(right)) {\n return Duration.fromMilliseconds(checked(left.milliseconds - right.milliseconds, path));\n }\n if (isInstant(left) && isDuration(right)) {\n return Instant.fromMilliseconds(checked(left.milliseconds - right.milliseconds, path));\n }\n if (isDuration(left) && isDuration(right)) {\n return Duration.fromMilliseconds(checked(left.milliseconds - right.milliseconds, path));\n }\n return mismatch(path);\n}\n\nfunction assertSameType(left: TemporalValue, right: TemporalValue, path: Path): void {\n if ((isInstant(left) && !isInstant(right)) || (isDuration(left) && !isDuration(right))) {\n mismatch(path);\n }\n}\n\nfunction compare(\n operator: Extract<KaladaV1Expression, { kind: \"temporal-comparison\" }>[\"operator\"],\n left: number,\n right: number,\n): boolean {\n if (operator === \"equal\") return left === right;\n if (operator === \"not-equal\") return left !== right;\n if (operator === \"less-than\") return left < right;\n if (operator === \"less-than-or-equal\") return left <= right;\n if (operator === \"greater-than\") return left > right;\n return left >= right;\n}\n\nfunction checked(output: number, path: Path): number {\n if (!Number.isSafeInteger(output)) throw new KaladaFailure(\"KALADA_TEMPORAL_OVERFLOW\", path);\n return Object.is(output, -0) ? 0 : output;\n}\n\nfunction mismatch(path: Path): never {\n throw new KaladaFailure(\"KALADA_TEMPORAL_TYPE_MISMATCH\", path);\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { JsonValue } from './json.cjs';
|
|
2
|
+
import { InstantValue } from './temporal.cjs';
|
|
3
|
+
import { KaladaV1Expression } from './types.cjs';
|
|
4
|
+
import { KaladaValue } from './values.cjs';
|
|
5
|
+
|
|
6
|
+
type Path = readonly (string | number)[];
|
|
7
|
+
type TemporalExpression<R extends JsonValue> = Extract<KaladaV1Expression<R>, {
|
|
8
|
+
kind: "instant" | "duration" | "current-instant" | `temporal-${string}`;
|
|
9
|
+
}>;
|
|
10
|
+
declare function isTemporalExpression<R extends JsonValue>(node: KaladaV1Expression<R>): node is TemporalExpression<R>;
|
|
11
|
+
declare function evaluateTemporalExpression<R extends JsonValue>(node: TemporalExpression<R>, path: Path, instant: InstantValue | undefined, evaluate: (node: KaladaV1Expression<R>, path: Path) => KaladaValue): KaladaValue;
|
|
12
|
+
|
|
13
|
+
export { evaluateTemporalExpression, isTemporalExpression };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { JsonValue } from './json.js';
|
|
2
|
+
import { InstantValue } from './temporal.js';
|
|
3
|
+
import { KaladaV1Expression } from './types.js';
|
|
4
|
+
import { KaladaValue } from './values.js';
|
|
5
|
+
|
|
6
|
+
type Path = readonly (string | number)[];
|
|
7
|
+
type TemporalExpression<R extends JsonValue> = Extract<KaladaV1Expression<R>, {
|
|
8
|
+
kind: "instant" | "duration" | "current-instant" | `temporal-${string}`;
|
|
9
|
+
}>;
|
|
10
|
+
declare function isTemporalExpression<R extends JsonValue>(node: KaladaV1Expression<R>): node is TemporalExpression<R>;
|
|
11
|
+
declare function evaluateTemporalExpression<R extends JsonValue>(node: TemporalExpression<R>, path: Path, instant: InstantValue | undefined, evaluate: (node: KaladaV1Expression<R>, path: Path) => KaladaValue): KaladaValue;
|
|
12
|
+
|
|
13
|
+
export { evaluateTemporalExpression, isTemporalExpression };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { KaladaFailure } from './diagnostics.js';
|
|
2
|
+
import { Instant, Duration, isInstant, isDuration } from './temporal.js';
|
|
3
|
+
|
|
4
|
+
function isTemporalExpression(node) {
|
|
5
|
+
return node.kind === "instant" || node.kind === "duration" || node.kind === "current-instant" || node.kind === "temporal-arithmetic" || node.kind === "temporal-comparison";
|
|
6
|
+
}
|
|
7
|
+
function evaluateTemporalExpression(node, path, instant, evaluate) {
|
|
8
|
+
if (node.kind === "instant") return Instant.fromMilliseconds(node.milliseconds);
|
|
9
|
+
if (node.kind === "duration") return Duration.fromMilliseconds(node.milliseconds);
|
|
10
|
+
if (node.kind === "current-instant") {
|
|
11
|
+
if (!instant) throw new KaladaFailure("KALADA_INSTANT_REQUIRED", path);
|
|
12
|
+
return instant;
|
|
13
|
+
}
|
|
14
|
+
const left = temporalOperand(evaluate, node.left, [...path, "left"]);
|
|
15
|
+
const right = temporalOperand(evaluate, node.right, [...path, "right"]);
|
|
16
|
+
if (node.kind === "temporal-comparison") {
|
|
17
|
+
assertSameType(left, right, [...path, "right"]);
|
|
18
|
+
return compare(node.operator, left.milliseconds, right.milliseconds);
|
|
19
|
+
}
|
|
20
|
+
return node.operator === "add" ? add(left, right, [...path, "right"]) : subtract(left, right, [...path, "right"]);
|
|
21
|
+
}
|
|
22
|
+
function temporalOperand(evaluate, node, path) {
|
|
23
|
+
const value = evaluate(node, path);
|
|
24
|
+
if (!isInstant(value) && !isDuration(value)) mismatch(path);
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
function add(left, right, path) {
|
|
28
|
+
if (isInstant(left) && isDuration(right)) {
|
|
29
|
+
return Instant.fromMilliseconds(checked(left.milliseconds + right.milliseconds, path));
|
|
30
|
+
}
|
|
31
|
+
if (isDuration(left) && isDuration(right)) {
|
|
32
|
+
return Duration.fromMilliseconds(checked(left.milliseconds + right.milliseconds, path));
|
|
33
|
+
}
|
|
34
|
+
return mismatch(path);
|
|
35
|
+
}
|
|
36
|
+
function subtract(left, right, path) {
|
|
37
|
+
if (isInstant(left) && isInstant(right)) {
|
|
38
|
+
return Duration.fromMilliseconds(checked(left.milliseconds - right.milliseconds, path));
|
|
39
|
+
}
|
|
40
|
+
if (isInstant(left) && isDuration(right)) {
|
|
41
|
+
return Instant.fromMilliseconds(checked(left.milliseconds - right.milliseconds, path));
|
|
42
|
+
}
|
|
43
|
+
if (isDuration(left) && isDuration(right)) {
|
|
44
|
+
return Duration.fromMilliseconds(checked(left.milliseconds - right.milliseconds, path));
|
|
45
|
+
}
|
|
46
|
+
return mismatch(path);
|
|
47
|
+
}
|
|
48
|
+
function assertSameType(left, right, path) {
|
|
49
|
+
if (isInstant(left) && !isInstant(right) || isDuration(left) && !isDuration(right)) {
|
|
50
|
+
mismatch(path);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function compare(operator, left, right) {
|
|
54
|
+
if (operator === "equal") return left === right;
|
|
55
|
+
if (operator === "not-equal") return left !== right;
|
|
56
|
+
if (operator === "less-than") return left < right;
|
|
57
|
+
if (operator === "less-than-or-equal") return left <= right;
|
|
58
|
+
if (operator === "greater-than") return left > right;
|
|
59
|
+
return left >= right;
|
|
60
|
+
}
|
|
61
|
+
function checked(output, path) {
|
|
62
|
+
if (!Number.isSafeInteger(output)) throw new KaladaFailure("KALADA_TEMPORAL_OVERFLOW", path);
|
|
63
|
+
return Object.is(output, -0) ? 0 : output;
|
|
64
|
+
}
|
|
65
|
+
function mismatch(path) {
|
|
66
|
+
throw new KaladaFailure("KALADA_TEMPORAL_TYPE_MISMATCH", path);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export { evaluateTemporalExpression, isTemporalExpression };
|
|
70
|
+
//# sourceMappingURL=temporal-evaluation.js.map
|
|
71
|
+
//# sourceMappingURL=temporal-evaluation.js.map
|