@kalada/core 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -3
- 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 +26 -0
- package/dist/kalada-v1/canonical-input.d.ts +26 -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 +93 -130
- package/dist/kalada-v1/canonicalize.cjs.map +1 -1
- package/dist/kalada-v1/canonicalize.d.cts +1 -0
- package/dist/kalada-v1/canonicalize.d.ts +1 -0
- package/dist/kalada-v1/canonicalize.js +71 -108
- package/dist/kalada-v1/canonicalize.js.map +1 -1
- package/dist/kalada-v1/codec.cjs +24 -0
- package/dist/kalada-v1/codec.cjs.map +1 -1
- package/dist/kalada-v1/codec.d.cts +5 -0
- package/dist/kalada-v1/codec.d.ts +5 -0
- package/dist/kalada-v1/codec.js +24 -0
- package/dist/kalada-v1/codec.js.map +1 -1
- package/dist/kalada-v1/compile.cjs +24 -1
- package/dist/kalada-v1/compile.cjs.map +1 -1
- package/dist/kalada-v1/compile.d.cts +1 -0
- package/dist/kalada-v1/compile.d.ts +1 -0
- package/dist/kalada-v1/compile.js +25 -2
- package/dist/kalada-v1/compile.js.map +1 -1
- package/dist/kalada-v1/dependencies.cjs +55 -2
- package/dist/kalada-v1/dependencies.cjs.map +1 -1
- package/dist/kalada-v1/dependencies.d.cts +1 -0
- package/dist/kalada-v1/dependencies.d.ts +1 -0
- package/dist/kalada-v1/dependencies.js +55 -2
- package/dist/kalada-v1/dependencies.js.map +1 -1
- package/dist/kalada-v1/diagnostics.cjs +29 -4
- package/dist/kalada-v1/diagnostics.cjs.map +1 -1
- package/dist/kalada-v1/diagnostics.d.cts +5 -3
- package/dist/kalada-v1/diagnostics.d.ts +5 -3
- package/dist/kalada-v1/diagnostics.js +29 -4
- package/dist/kalada-v1/diagnostics.js.map +1 -1
- package/dist/kalada-v1/evaluate.cjs +23 -117
- package/dist/kalada-v1/evaluate.cjs.map +1 -1
- package/dist/kalada-v1/evaluate.d.cts +4 -2
- package/dist/kalada-v1/evaluate.d.ts +4 -2
- package/dist/kalada-v1/evaluate.js +24 -118
- package/dist/kalada-v1/evaluate.js.map +1 -1
- package/dist/kalada-v1/evaluation-delivery.cjs +286 -0
- package/dist/kalada-v1/evaluation-delivery.cjs.map +1 -0
- package/dist/kalada-v1/evaluation-delivery.d.cts +13 -0
- package/dist/kalada-v1/evaluation-delivery.d.ts +13 -0
- package/dist/kalada-v1/evaluation-delivery.js +284 -0
- package/dist/kalada-v1/evaluation-delivery.js.map +1 -0
- package/dist/kalada-v1/evaluation-frames.cjs +16 -0
- package/dist/kalada-v1/evaluation-frames.cjs.map +1 -0
- package/dist/kalada-v1/evaluation-frames.d.cts +83 -0
- package/dist/kalada-v1/evaluation-frames.d.ts +83 -0
- package/dist/kalada-v1/evaluation-frames.js +14 -0
- package/dist/kalada-v1/evaluation-frames.js.map +1 -0
- package/dist/kalada-v1/evaluation-machine.cjs +226 -0
- package/dist/kalada-v1/evaluation-machine.cjs.map +1 -0
- package/dist/kalada-v1/evaluation-machine.d.cts +9 -0
- package/dist/kalada-v1/evaluation-machine.d.ts +9 -0
- package/dist/kalada-v1/evaluation-machine.js +224 -0
- package/dist/kalada-v1/evaluation-machine.js.map +1 -0
- package/dist/kalada-v1/evaluation-resolution.cjs +80 -0
- package/dist/kalada-v1/evaluation-resolution.cjs.map +1 -0
- package/dist/kalada-v1/evaluation-resolution.d.cts +11 -0
- package/dist/kalada-v1/evaluation-resolution.d.ts +11 -0
- package/dist/kalada-v1/evaluation-resolution.js +78 -0
- package/dist/kalada-v1/evaluation-resolution.js.map +1 -0
- package/dist/kalada-v1/evaluation-state.cjs +94 -0
- package/dist/kalada-v1/evaluation-state.cjs.map +1 -0
- package/dist/kalada-v1/evaluation-state.d.cts +38 -0
- package/dist/kalada-v1/evaluation-state.d.ts +38 -0
- package/dist/kalada-v1/evaluation-state.js +81 -0
- package/dist/kalada-v1/evaluation-state.js.map +1 -0
- package/dist/kalada-v1/factories.cjs +46 -0
- package/dist/kalada-v1/factories.cjs.map +1 -1
- package/dist/kalada-v1/factories.d.cts +24 -1
- package/dist/kalada-v1/factories.d.ts +24 -1
- package/dist/kalada-v1/factories.js +46 -0
- package/dist/kalada-v1/factories.js.map +1 -1
- package/dist/kalada-v1/function-contracts.cjs +150 -0
- package/dist/kalada-v1/function-contracts.cjs.map +1 -0
- package/dist/kalada-v1/function-contracts.d.cts +15 -0
- package/dist/kalada-v1/function-contracts.d.ts +15 -0
- package/dist/kalada-v1/function-contracts.js +144 -0
- package/dist/kalada-v1/function-contracts.js.map +1 -0
- package/dist/kalada-v1/index.cjs +30 -0
- package/dist/kalada-v1/index.d.cts +5 -3
- package/dist/kalada-v1/index.d.ts +5 -3
- package/dist/kalada-v1/index.js +4 -2
- package/dist/kalada-v1/limits.cjs +23 -2
- package/dist/kalada-v1/limits.cjs.map +1 -1
- package/dist/kalada-v1/limits.d.cts +6 -3
- package/dist/kalada-v1/limits.d.ts +6 -3
- package/dist/kalada-v1/limits.js +23 -3
- package/dist/kalada-v1/limits.js.map +1 -1
- package/dist/kalada-v1/runtime-values.cjs +112 -0
- package/dist/kalada-v1/runtime-values.cjs.map +1 -0
- package/dist/kalada-v1/runtime-values.d.cts +35 -0
- package/dist/kalada-v1/runtime-values.d.ts +35 -0
- package/dist/kalada-v1/runtime-values.js +105 -0
- package/dist/kalada-v1/runtime-values.js.map +1 -0
- package/dist/kalada-v1/schemas.cjs +136 -3
- package/dist/kalada-v1/schemas.cjs.map +1 -1
- package/dist/kalada-v1/schemas.d.cts +2 -1
- package/dist/kalada-v1/schemas.d.ts +2 -1
- package/dist/kalada-v1/schemas.js +137 -5
- package/dist/kalada-v1/schemas.js.map +1 -1
- package/dist/kalada-v1/static-analysis.cjs +177 -0
- package/dist/kalada-v1/static-analysis.cjs.map +1 -0
- package/dist/kalada-v1/static-analysis.d.cts +9 -0
- package/dist/kalada-v1/static-analysis.d.ts +9 -0
- package/dist/kalada-v1/static-analysis.js +175 -0
- package/dist/kalada-v1/static-analysis.js.map +1 -0
- package/dist/kalada-v1/static-types.cjs +229 -0
- package/dist/kalada-v1/static-types.cjs.map +1 -0
- package/dist/kalada-v1/static-types.d.cts +8 -0
- package/dist/kalada-v1/static-types.d.ts +8 -0
- package/dist/kalada-v1/static-types.js +227 -0
- package/dist/kalada-v1/static-types.js.map +1 -0
- package/dist/kalada-v1/temporal-evaluation.cjs +95 -0
- package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -0
- package/dist/kalada-v1/temporal-evaluation.d.cts +18 -0
- package/dist/kalada-v1/temporal-evaluation.d.ts +18 -0
- package/dist/kalada-v1/temporal-evaluation.js +90 -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.d.cts +108 -5
- package/dist/kalada-v1/types.d.ts +108 -5
- package/dist/kalada-v1/values.cjs +13 -1
- package/dist/kalada-v1/values.cjs.map +1 -1
- package/dist/kalada-v1/values.d.cts +2 -1
- package/dist/kalada-v1/values.d.ts +2 -1
- package/dist/kalada-v1/values.js +13 -1
- package/dist/kalada-v1/values.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { JsonValue } from './json.js';
|
|
2
|
+
import { InstantValue } from './temporal.js';
|
|
2
3
|
import { KaladaValue } from './values.js';
|
|
3
4
|
|
|
4
5
|
type KaladaV1Expression<R extends JsonValue = string> = {
|
|
@@ -7,7 +8,81 @@ type KaladaV1Expression<R extends JsonValue = string> = {
|
|
|
7
8
|
} | {
|
|
8
9
|
readonly kind: "ref";
|
|
9
10
|
readonly ref: R;
|
|
10
|
-
} | BindingExpression<R> | OptionExpression<R> | ResultExpression<R> | MatchExpression<R
|
|
11
|
+
} | BindingExpression<R> | OptionExpression<R> | ResultExpression<R> | MatchExpression<R> | InstantExpression | DurationExpression | CurrentInstantExpression | TemporalArithmeticExpression<R> | TemporalComparisonExpression<R> | FunctionExpression<R> | CallExpression<R> | FunctionGroupExpression<R> | CoreFunctionExpression;
|
|
12
|
+
type KaladaPrimitiveTypeName = "null" | "boolean" | "number" | "string" | "json" | "Instant" | "Duration";
|
|
13
|
+
type KaladaType = {
|
|
14
|
+
readonly kind: "primitive-type";
|
|
15
|
+
readonly name: KaladaPrimitiveTypeName;
|
|
16
|
+
} | {
|
|
17
|
+
readonly kind: "option-type";
|
|
18
|
+
readonly value: KaladaType;
|
|
19
|
+
} | {
|
|
20
|
+
readonly kind: "result-type";
|
|
21
|
+
readonly ok: KaladaType;
|
|
22
|
+
readonly error: KaladaType;
|
|
23
|
+
} | {
|
|
24
|
+
readonly kind: "array-type";
|
|
25
|
+
readonly element: KaladaType;
|
|
26
|
+
} | KaladaFunctionType;
|
|
27
|
+
interface KaladaFunctionType {
|
|
28
|
+
readonly kind: "function-type";
|
|
29
|
+
readonly parameters: readonly KaladaType[];
|
|
30
|
+
readonly returns: KaladaType;
|
|
31
|
+
}
|
|
32
|
+
interface KaladaFunctionParameter {
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly type: KaladaType;
|
|
35
|
+
}
|
|
36
|
+
interface FunctionExpression<R extends JsonValue> {
|
|
37
|
+
readonly kind: "function";
|
|
38
|
+
readonly parameters: readonly KaladaFunctionParameter[];
|
|
39
|
+
readonly returns: KaladaType;
|
|
40
|
+
readonly body: KaladaV1Expression<R>;
|
|
41
|
+
}
|
|
42
|
+
interface CallExpression<R extends JsonValue> {
|
|
43
|
+
readonly kind: "call";
|
|
44
|
+
readonly callee: KaladaV1Expression<R>;
|
|
45
|
+
readonly arguments: readonly KaladaV1Expression<R>[];
|
|
46
|
+
}
|
|
47
|
+
interface NamedFunction<R extends JsonValue> {
|
|
48
|
+
readonly name: string;
|
|
49
|
+
readonly parameters: readonly KaladaFunctionParameter[];
|
|
50
|
+
readonly returns: KaladaType;
|
|
51
|
+
readonly body: KaladaV1Expression<R>;
|
|
52
|
+
}
|
|
53
|
+
interface FunctionGroupExpression<R extends JsonValue> {
|
|
54
|
+
readonly kind: "function-group";
|
|
55
|
+
readonly functions: readonly NamedFunction<R>[];
|
|
56
|
+
readonly body: KaladaV1Expression<R>;
|
|
57
|
+
}
|
|
58
|
+
type KaladaCoreFunctionName = "map" | "filter" | "some" | "every";
|
|
59
|
+
interface CoreFunctionExpression {
|
|
60
|
+
readonly kind: "core-function";
|
|
61
|
+
readonly name: KaladaCoreFunctionName;
|
|
62
|
+
}
|
|
63
|
+
interface InstantExpression {
|
|
64
|
+
readonly kind: "instant";
|
|
65
|
+
readonly milliseconds: number;
|
|
66
|
+
}
|
|
67
|
+
interface DurationExpression {
|
|
68
|
+
readonly kind: "duration";
|
|
69
|
+
readonly milliseconds: number;
|
|
70
|
+
}
|
|
71
|
+
interface CurrentInstantExpression {
|
|
72
|
+
readonly kind: "current-instant";
|
|
73
|
+
}
|
|
74
|
+
interface TemporalArithmeticExpression<R extends JsonValue> {
|
|
75
|
+
readonly kind: "temporal-arithmetic";
|
|
76
|
+
readonly operator: "add" | "subtract";
|
|
77
|
+
readonly left: KaladaV1Expression<R>;
|
|
78
|
+
readonly right: KaladaV1Expression<R>;
|
|
79
|
+
}
|
|
80
|
+
interface TemporalComparisonExpression<R extends JsonValue> {
|
|
81
|
+
readonly kind: "temporal-comparison";
|
|
82
|
+
readonly operator: "equal" | "not-equal" | "less-than" | "less-than-or-equal" | "greater-than" | "greater-than-or-equal";
|
|
83
|
+
readonly left: KaladaV1Expression<R>;
|
|
84
|
+
readonly right: KaladaV1Expression<R>;
|
|
85
|
+
}
|
|
11
86
|
interface BindingExpression<R extends JsonValue> {
|
|
12
87
|
readonly kind: "binding";
|
|
13
88
|
readonly name: string;
|
|
@@ -44,11 +119,17 @@ interface KaladaV1Program<R extends JsonValue = string> {
|
|
|
44
119
|
readonly profile: "kalada-v1";
|
|
45
120
|
readonly expression: KaladaV1Expression<R>;
|
|
46
121
|
}
|
|
47
|
-
type KaladaV1DiagnosticCode = "KALADA_INVALID_INPUT" | "KALADA_LIMIT_EXCEEDED" | "KALADA_INVALID_REFERENCE" | "KALADA_MATCH_MISSING_ARM" | "KALADA_MATCH_DUPLICATE_ARM" | "KALADA_MATCH_UNKNOWN_ARM" | "KALADA_MATCH_UNREACHABLE_ARM" | "KALADA_MATCH_TYPE_MISMATCH" | "KALADA_REFERENCE_ERROR" | "KALADA_REFERENCE_MISSING" | "KALADA_REFERENCE_DENIED" | "KALADA_ASYNC_UNSUPPORTED" | "KALADA_INVALID_RESULT" | "KALADA_EVALUATION_LIMIT";
|
|
122
|
+
type KaladaV1DiagnosticCode = "KALADA_INVALID_INPUT" | "KALADA_LIMIT_EXCEEDED" | "KALADA_INVALID_REFERENCE" | "KALADA_MATCH_MISSING_ARM" | "KALADA_MATCH_DUPLICATE_ARM" | "KALADA_MATCH_UNKNOWN_ARM" | "KALADA_MATCH_UNREACHABLE_ARM" | "KALADA_MATCH_TYPE_MISMATCH" | "KALADA_REFERENCE_ERROR" | "KALADA_REFERENCE_MISSING" | "KALADA_REFERENCE_DENIED" | "KALADA_ASYNC_UNSUPPORTED" | "KALADA_INVALID_RESULT" | "KALADA_EVALUATION_LIMIT" | "KALADA_INSTANT_REQUIRED" | "KALADA_TEMPORAL_TYPE_MISMATCH" | "KALADA_TEMPORAL_OVERFLOW" | "KALADA_CLOCK_ERROR" | "KALADA_INVALID_CLOCK" | "KALADA_DUPLICATE_BINDING" | "KALADA_INVALID_FUNCTION_TYPE" | "KALADA_CAPTURE_LIMIT" | "KALADA_NOT_CALLABLE" | "KALADA_FUNCTION_ARITY" | "KALADA_FUNCTION_TYPE_MISMATCH" | "KALADA_CLOSURE_LIMIT" | "KALADA_CALL_DEPTH_LIMIT" | "KALADA_CONTINUATION_LIMIT" | "KALADA_COLLECTION_TYPE_MISMATCH" | "KALADA_COLLECTION_LIMIT" | "KALADA_FUNCTION_ESCAPE";
|
|
123
|
+
interface KaladaV1DiagnosticContextFrame {
|
|
124
|
+
readonly kind: "function-call" | "core-call";
|
|
125
|
+
readonly name: string | null;
|
|
126
|
+
readonly path: readonly (string | number)[];
|
|
127
|
+
}
|
|
48
128
|
interface KaladaV1Diagnostic {
|
|
49
129
|
readonly code: KaladaV1DiagnosticCode;
|
|
50
130
|
readonly path: readonly (string | number)[];
|
|
51
131
|
readonly message: string;
|
|
132
|
+
readonly context?: readonly KaladaV1DiagnosticContextFrame[];
|
|
52
133
|
}
|
|
53
134
|
type KaladaV1Outcome<T> = {
|
|
54
135
|
readonly ok: true;
|
|
@@ -66,13 +147,29 @@ interface KaladaV1Limits {
|
|
|
66
147
|
readonly maxReferenceLength: number;
|
|
67
148
|
readonly maxEvaluationSteps: number;
|
|
68
149
|
}
|
|
150
|
+
interface KaladaV1FunctionLimits {
|
|
151
|
+
readonly maxFunctionParameters: number;
|
|
152
|
+
readonly maxFunctionGroupSize: number;
|
|
153
|
+
readonly maxCapturesPerClosure: number;
|
|
154
|
+
readonly maxCapturedBindings: number;
|
|
155
|
+
readonly maxClosures: number;
|
|
156
|
+
readonly maxCallDepth: number;
|
|
157
|
+
readonly maxContinuationFrames: number;
|
|
158
|
+
readonly maxCollectionLength: number;
|
|
159
|
+
readonly maxCollectionIterations: number;
|
|
160
|
+
}
|
|
161
|
+
interface KaladaV1FunctionCapture {
|
|
162
|
+
readonly path: readonly (string | number)[];
|
|
163
|
+
readonly name: string | null;
|
|
164
|
+
readonly captures: readonly string[];
|
|
165
|
+
}
|
|
69
166
|
interface KaladaV1ReferenceCodec<R extends JsonValue> {
|
|
70
167
|
readonly validate: (input: unknown) => input is R;
|
|
71
168
|
readonly canonicalize?: (reference: R) => R;
|
|
72
169
|
}
|
|
73
170
|
interface KaladaV1Options<R extends JsonValue> {
|
|
74
171
|
readonly reference?: KaladaV1ReferenceCodec<R>;
|
|
75
|
-
readonly limits?: Partial<KaladaV1Limits>;
|
|
172
|
+
readonly limits?: Partial<KaladaV1Limits & KaladaV1FunctionLimits>;
|
|
76
173
|
}
|
|
77
174
|
type KaladaV1Resolution = {
|
|
78
175
|
readonly found: true;
|
|
@@ -82,10 +179,16 @@ type KaladaV1Resolution = {
|
|
|
82
179
|
readonly reason?: "missing" | "denied";
|
|
83
180
|
};
|
|
84
181
|
type KaladaV1Resolver<R extends JsonValue> = (reference: R) => KaladaV1Resolution;
|
|
182
|
+
interface KaladaV1EvaluationInputs {
|
|
183
|
+
readonly instant?: InstantValue;
|
|
184
|
+
}
|
|
185
|
+
type KaladaV1Clock = () => InstantValue;
|
|
85
186
|
interface CompiledKaladaV1Program<R extends JsonValue> {
|
|
86
187
|
readonly program: KaladaV1Program<R>;
|
|
87
188
|
readonly dependencies: readonly R[];
|
|
88
|
-
|
|
189
|
+
readonly functions: readonly KaladaV1FunctionCapture[];
|
|
190
|
+
evaluate(resolve: KaladaV1Resolver<R>, inputs?: KaladaV1EvaluationInputs): KaladaV1Outcome<KaladaValue>;
|
|
191
|
+
evaluateWithClock(resolve: KaladaV1Resolver<R>, clock: KaladaV1Clock): KaladaV1Outcome<KaladaValue>;
|
|
89
192
|
}
|
|
90
193
|
|
|
91
|
-
export type { BindingExpression, CompiledKaladaV1Program, KaladaV1Diagnostic, KaladaV1DiagnosticCode, KaladaV1Expression, KaladaV1Limits, KaladaV1Options, KaladaV1Outcome, KaladaV1Program, KaladaV1ReferenceCodec, KaladaV1Resolution, KaladaV1Resolver, MatchArm, MatchExpression, OptionExpression, ResultExpression };
|
|
194
|
+
export type { 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 };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var json_js = require('./json.js');
|
|
4
|
+
var temporal_js = require('./temporal.js');
|
|
4
5
|
|
|
5
6
|
const optionBrands = /* @__PURE__ */ new WeakSet();
|
|
6
7
|
const resultBrands = /* @__PURE__ */ new WeakSet();
|
|
@@ -15,7 +16,7 @@ function branded(brand, value) {
|
|
|
15
16
|
return value;
|
|
16
17
|
}
|
|
17
18
|
function snapshot(value) {
|
|
18
|
-
if (isOption(value) || isResult(value)) return value;
|
|
19
|
+
if (isOption(value) || isResult(value) || temporal_js.isInstant(value) || temporal_js.isDuration(value)) return value;
|
|
19
20
|
return json_js.cloneJson(value, DEFAULT_VALUE_LIMITS);
|
|
20
21
|
}
|
|
21
22
|
const NONE = branded(optionBrands, { type: "Option", variant: "none" });
|
|
@@ -54,6 +55,10 @@ function isResult(value) {
|
|
|
54
55
|
return typeof value === "object" && value !== null && resultBrands.has(value);
|
|
55
56
|
}
|
|
56
57
|
function equalKaladaValues(left, right) {
|
|
58
|
+
if (temporal_js.isInstant(left) || temporal_js.isInstant(right))
|
|
59
|
+
return temporal_js.isInstant(left) && temporal_js.isInstant(right) && left.milliseconds === right.milliseconds;
|
|
60
|
+
if (temporal_js.isDuration(left) || temporal_js.isDuration(right))
|
|
61
|
+
return temporal_js.isDuration(left) && temporal_js.isDuration(right) && left.milliseconds === right.milliseconds;
|
|
57
62
|
if (isOption(left) || isOption(right)) return equalOptions(left, right);
|
|
58
63
|
if (isResult(left) || isResult(right)) return equalResults(left, right);
|
|
59
64
|
return json_js.deepEqualJson(left, right);
|
|
@@ -72,6 +77,10 @@ function validateKaladaValueLimits(value, limits) {
|
|
|
72
77
|
current = current.value;
|
|
73
78
|
depth += 1;
|
|
74
79
|
}
|
|
80
|
+
if (temporal_js.isInstant(current) || temporal_js.isDuration(current)) {
|
|
81
|
+
validateTemporalLeaf(depth, nodes, limits);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
75
84
|
const remainingDepth = limits.maxDepth - depth;
|
|
76
85
|
if (remainingDepth < 0) throw new RangeError("limit");
|
|
77
86
|
json_js.cloneJsonWithStats(current, {
|
|
@@ -80,6 +89,9 @@ function validateKaladaValueLimits(value, limits) {
|
|
|
80
89
|
maxStringLength: limits.maxStringLength
|
|
81
90
|
});
|
|
82
91
|
}
|
|
92
|
+
function validateTemporalLeaf(depth, nodes, limits) {
|
|
93
|
+
if (depth > limits.maxDepth || nodes + 1 > limits.maxNodes) throw new RangeError("limit");
|
|
94
|
+
}
|
|
83
95
|
function equalOptions(left, right) {
|
|
84
96
|
if (!isOption(left) || !isOption(right) || left.variant !== right.variant) return false;
|
|
85
97
|
if (left.variant === "none" || right.variant === "none") return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/kalada-v1/values.ts"],"names":["cloneJson","deepEqualJson","cloneJsonWithStats"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/values.ts"],"names":["isInstant","isDuration","cloneJson","deepEqualJson","cloneJsonWithStats"],"mappings":"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","file":"values.cjs","sourcesContent":["import { cloneJson, cloneJsonWithStats, deepEqualJson, type JsonValue } from \"./json.js\";\nimport { type DurationValue, type InstantValue, isDuration, isInstant } from \"./temporal.js\";\n\nexport type KaladaValue = JsonValue | OptionValue | ResultValue | InstantValue | DurationValue;\nexport type OptionValue = SomeValue | NoneValue;\nexport type ResultValue = OkValue | ErrValue;\n\ndeclare const optionBrand: unique symbol;\ndeclare const resultBrand: unique symbol;\n\nexport interface SomeValue {\n readonly [optionBrand]: true;\n readonly type: \"Option\";\n readonly variant: \"some\";\n readonly value: KaladaValue;\n}\n\nexport interface NoneValue {\n readonly [optionBrand]: true;\n readonly type: \"Option\";\n readonly variant: \"none\";\n}\n\nexport interface OkValue {\n readonly [resultBrand]: true;\n readonly type: \"Result\";\n readonly variant: \"ok\";\n readonly value: KaladaValue;\n}\n\nexport interface ErrValue {\n readonly [resultBrand]: true;\n readonly type: \"Result\";\n readonly variant: \"err\";\n readonly value: KaladaValue;\n}\n\nconst optionBrands = new WeakSet<object>();\nconst resultBrands = new WeakSet<object>();\nconst DEFAULT_VALUE_LIMITS = Object.freeze({\n maxDepth: 64,\n maxNodes: 10_000,\n maxStringLength: 10_000,\n});\n\nfunction branded<T extends object>(brand: WeakSet<object>, value: T): T {\n Object.freeze(value);\n brand.add(value);\n return value;\n}\n\nfunction snapshot(value: KaladaValue): KaladaValue {\n if (isOption(value) || isResult(value) || isInstant(value) || isDuration(value)) return value;\n return cloneJson(value, DEFAULT_VALUE_LIMITS);\n}\n\nconst NONE = branded(optionBrands, { type: \"Option\", variant: \"none\" } as unknown as NoneValue);\n\nexport const Option = Object.freeze({\n some(value: KaladaValue): SomeValue {\n return branded(optionBrands, {\n type: \"Option\",\n variant: \"some\",\n value: snapshot(value),\n } as unknown as SomeValue);\n },\n none(): NoneValue {\n return NONE;\n },\n});\n\nexport const Result = Object.freeze({\n ok(value: KaladaValue): OkValue {\n return branded(resultBrands, {\n type: \"Result\",\n variant: \"ok\",\n value: snapshot(value),\n } as unknown as OkValue);\n },\n err(value: KaladaValue): ErrValue {\n return branded(resultBrands, {\n type: \"Result\",\n variant: \"err\",\n value: snapshot(value),\n } as unknown as ErrValue);\n },\n});\n\nexport function isOption(value: unknown): value is OptionValue {\n return typeof value === \"object\" && value !== null && optionBrands.has(value);\n}\n\nexport function isResult(value: unknown): value is ResultValue {\n return typeof value === \"object\" && value !== null && resultBrands.has(value);\n}\n\nexport function equalKaladaValues(left: KaladaValue, right: KaladaValue): boolean {\n if (isInstant(left) || isInstant(right))\n return isInstant(left) && isInstant(right) && left.milliseconds === right.milliseconds;\n if (isDuration(left) || isDuration(right))\n return isDuration(left) && isDuration(right) && left.milliseconds === right.milliseconds;\n if (isOption(left) || isOption(right)) return equalOptions(left, right);\n if (isResult(left) || isResult(right)) return equalResults(left, right);\n return deepEqualJson(left, right);\n}\n\nexport function validateKaladaValueLimits(\n value: KaladaValue,\n limits: {\n readonly maxDepth: number;\n readonly maxNodes: number;\n readonly maxStringLength: number;\n },\n): void {\n const seen = new WeakSet<object>();\n let current = value;\n let depth = 0;\n let nodes = 0;\n while (isOption(current) || isResult(current)) {\n nodes += 1;\n if (depth > limits.maxDepth || nodes > limits.maxNodes) throw new RangeError(\"limit\");\n if (seen.has(current)) throw new TypeError(\"cycle\");\n seen.add(current);\n if (isOption(current) && current.variant === \"none\") return;\n current = current.value;\n depth += 1;\n }\n if (isInstant(current) || isDuration(current)) {\n validateTemporalLeaf(depth, nodes, limits);\n return;\n }\n const remainingDepth = limits.maxDepth - depth;\n if (remainingDepth < 0) throw new RangeError(\"limit\");\n cloneJsonWithStats(current, {\n maxDepth: remainingDepth,\n maxNodes: limits.maxNodes - nodes,\n maxStringLength: limits.maxStringLength,\n });\n}\n\nfunction validateTemporalLeaf(\n depth: number,\n nodes: number,\n limits: { readonly maxDepth: number; readonly maxNodes: number },\n): void {\n if (depth > limits.maxDepth || nodes + 1 > limits.maxNodes) throw new RangeError(\"limit\");\n}\n\nfunction equalOptions(left: KaladaValue, right: KaladaValue): boolean {\n if (!isOption(left) || !isOption(right) || left.variant !== right.variant) return false;\n if (left.variant === \"none\" || right.variant === \"none\") return true;\n return equalKaladaValues(left.value, right.value);\n}\n\nfunction equalResults(left: KaladaValue, right: KaladaValue): boolean {\n if (!isResult(left) || !isResult(right) || left.variant !== right.variant) return false;\n return equalKaladaValues(left.value, right.value);\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { JsonValue } from './json.cjs';
|
|
2
|
+
import { InstantValue, DurationValue } from './temporal.cjs';
|
|
2
3
|
|
|
3
|
-
type KaladaValue = JsonValue | OptionValue | ResultValue;
|
|
4
|
+
type KaladaValue = JsonValue | OptionValue | ResultValue | InstantValue | DurationValue;
|
|
4
5
|
type OptionValue = SomeValue | NoneValue;
|
|
5
6
|
type ResultValue = OkValue | ErrValue;
|
|
6
7
|
declare const optionBrand: unique symbol;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { JsonValue } from './json.js';
|
|
2
|
+
import { InstantValue, DurationValue } from './temporal.js';
|
|
2
3
|
|
|
3
|
-
type KaladaValue = JsonValue | OptionValue | ResultValue;
|
|
4
|
+
type KaladaValue = JsonValue | OptionValue | ResultValue | InstantValue | DurationValue;
|
|
4
5
|
type OptionValue = SomeValue | NoneValue;
|
|
5
6
|
type ResultValue = OkValue | ErrValue;
|
|
6
7
|
declare const optionBrand: unique symbol;
|
package/dist/kalada-v1/values.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { deepEqualJson, cloneJsonWithStats, cloneJson } from './json.js';
|
|
2
|
+
import { isInstant, isDuration } from './temporal.js';
|
|
2
3
|
|
|
3
4
|
const optionBrands = /* @__PURE__ */ new WeakSet();
|
|
4
5
|
const resultBrands = /* @__PURE__ */ new WeakSet();
|
|
@@ -13,7 +14,7 @@ function branded(brand, value) {
|
|
|
13
14
|
return value;
|
|
14
15
|
}
|
|
15
16
|
function snapshot(value) {
|
|
16
|
-
if (isOption(value) || isResult(value)) return value;
|
|
17
|
+
if (isOption(value) || isResult(value) || isInstant(value) || isDuration(value)) return value;
|
|
17
18
|
return cloneJson(value, DEFAULT_VALUE_LIMITS);
|
|
18
19
|
}
|
|
19
20
|
const NONE = branded(optionBrands, { type: "Option", variant: "none" });
|
|
@@ -52,6 +53,10 @@ function isResult(value) {
|
|
|
52
53
|
return typeof value === "object" && value !== null && resultBrands.has(value);
|
|
53
54
|
}
|
|
54
55
|
function equalKaladaValues(left, right) {
|
|
56
|
+
if (isInstant(left) || isInstant(right))
|
|
57
|
+
return isInstant(left) && isInstant(right) && left.milliseconds === right.milliseconds;
|
|
58
|
+
if (isDuration(left) || isDuration(right))
|
|
59
|
+
return isDuration(left) && isDuration(right) && left.milliseconds === right.milliseconds;
|
|
55
60
|
if (isOption(left) || isOption(right)) return equalOptions(left, right);
|
|
56
61
|
if (isResult(left) || isResult(right)) return equalResults(left, right);
|
|
57
62
|
return deepEqualJson(left, right);
|
|
@@ -70,6 +75,10 @@ function validateKaladaValueLimits(value, limits) {
|
|
|
70
75
|
current = current.value;
|
|
71
76
|
depth += 1;
|
|
72
77
|
}
|
|
78
|
+
if (isInstant(current) || isDuration(current)) {
|
|
79
|
+
validateTemporalLeaf(depth, nodes, limits);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
73
82
|
const remainingDepth = limits.maxDepth - depth;
|
|
74
83
|
if (remainingDepth < 0) throw new RangeError("limit");
|
|
75
84
|
cloneJsonWithStats(current, {
|
|
@@ -78,6 +87,9 @@ function validateKaladaValueLimits(value, limits) {
|
|
|
78
87
|
maxStringLength: limits.maxStringLength
|
|
79
88
|
});
|
|
80
89
|
}
|
|
90
|
+
function validateTemporalLeaf(depth, nodes, limits) {
|
|
91
|
+
if (depth > limits.maxDepth || nodes + 1 > limits.maxNodes) throw new RangeError("limit");
|
|
92
|
+
}
|
|
81
93
|
function equalOptions(left, right) {
|
|
82
94
|
if (!isOption(left) || !isOption(right) || left.variant !== right.variant) return false;
|
|
83
95
|
if (left.variant === "none" || right.variant === "none") return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/kalada-v1/values.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/values.ts"],"names":[],"mappings":"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","file":"values.js","sourcesContent":["import { cloneJson, cloneJsonWithStats, deepEqualJson, type JsonValue } from \"./json.js\";\nimport { type DurationValue, type InstantValue, isDuration, isInstant } from \"./temporal.js\";\n\nexport type KaladaValue = JsonValue | OptionValue | ResultValue | InstantValue | DurationValue;\nexport type OptionValue = SomeValue | NoneValue;\nexport type ResultValue = OkValue | ErrValue;\n\ndeclare const optionBrand: unique symbol;\ndeclare const resultBrand: unique symbol;\n\nexport interface SomeValue {\n readonly [optionBrand]: true;\n readonly type: \"Option\";\n readonly variant: \"some\";\n readonly value: KaladaValue;\n}\n\nexport interface NoneValue {\n readonly [optionBrand]: true;\n readonly type: \"Option\";\n readonly variant: \"none\";\n}\n\nexport interface OkValue {\n readonly [resultBrand]: true;\n readonly type: \"Result\";\n readonly variant: \"ok\";\n readonly value: KaladaValue;\n}\n\nexport interface ErrValue {\n readonly [resultBrand]: true;\n readonly type: \"Result\";\n readonly variant: \"err\";\n readonly value: KaladaValue;\n}\n\nconst optionBrands = new WeakSet<object>();\nconst resultBrands = new WeakSet<object>();\nconst DEFAULT_VALUE_LIMITS = Object.freeze({\n maxDepth: 64,\n maxNodes: 10_000,\n maxStringLength: 10_000,\n});\n\nfunction branded<T extends object>(brand: WeakSet<object>, value: T): T {\n Object.freeze(value);\n brand.add(value);\n return value;\n}\n\nfunction snapshot(value: KaladaValue): KaladaValue {\n if (isOption(value) || isResult(value) || isInstant(value) || isDuration(value)) return value;\n return cloneJson(value, DEFAULT_VALUE_LIMITS);\n}\n\nconst NONE = branded(optionBrands, { type: \"Option\", variant: \"none\" } as unknown as NoneValue);\n\nexport const Option = Object.freeze({\n some(value: KaladaValue): SomeValue {\n return branded(optionBrands, {\n type: \"Option\",\n variant: \"some\",\n value: snapshot(value),\n } as unknown as SomeValue);\n },\n none(): NoneValue {\n return NONE;\n },\n});\n\nexport const Result = Object.freeze({\n ok(value: KaladaValue): OkValue {\n return branded(resultBrands, {\n type: \"Result\",\n variant: \"ok\",\n value: snapshot(value),\n } as unknown as OkValue);\n },\n err(value: KaladaValue): ErrValue {\n return branded(resultBrands, {\n type: \"Result\",\n variant: \"err\",\n value: snapshot(value),\n } as unknown as ErrValue);\n },\n});\n\nexport function isOption(value: unknown): value is OptionValue {\n return typeof value === \"object\" && value !== null && optionBrands.has(value);\n}\n\nexport function isResult(value: unknown): value is ResultValue {\n return typeof value === \"object\" && value !== null && resultBrands.has(value);\n}\n\nexport function equalKaladaValues(left: KaladaValue, right: KaladaValue): boolean {\n if (isInstant(left) || isInstant(right))\n return isInstant(left) && isInstant(right) && left.milliseconds === right.milliseconds;\n if (isDuration(left) || isDuration(right))\n return isDuration(left) && isDuration(right) && left.milliseconds === right.milliseconds;\n if (isOption(left) || isOption(right)) return equalOptions(left, right);\n if (isResult(left) || isResult(right)) return equalResults(left, right);\n return deepEqualJson(left, right);\n}\n\nexport function validateKaladaValueLimits(\n value: KaladaValue,\n limits: {\n readonly maxDepth: number;\n readonly maxNodes: number;\n readonly maxStringLength: number;\n },\n): void {\n const seen = new WeakSet<object>();\n let current = value;\n let depth = 0;\n let nodes = 0;\n while (isOption(current) || isResult(current)) {\n nodes += 1;\n if (depth > limits.maxDepth || nodes > limits.maxNodes) throw new RangeError(\"limit\");\n if (seen.has(current)) throw new TypeError(\"cycle\");\n seen.add(current);\n if (isOption(current) && current.variant === \"none\") return;\n current = current.value;\n depth += 1;\n }\n if (isInstant(current) || isDuration(current)) {\n validateTemporalLeaf(depth, nodes, limits);\n return;\n }\n const remainingDepth = limits.maxDepth - depth;\n if (remainingDepth < 0) throw new RangeError(\"limit\");\n cloneJsonWithStats(current, {\n maxDepth: remainingDepth,\n maxNodes: limits.maxNodes - nodes,\n maxStringLength: limits.maxStringLength,\n });\n}\n\nfunction validateTemporalLeaf(\n depth: number,\n nodes: number,\n limits: { readonly maxDepth: number; readonly maxNodes: number },\n): void {\n if (depth > limits.maxDepth || nodes + 1 > limits.maxNodes) throw new RangeError(\"limit\");\n}\n\nfunction equalOptions(left: KaladaValue, right: KaladaValue): boolean {\n if (!isOption(left) || !isOption(right) || left.variant !== right.variant) return false;\n if (left.variant === \"none\" || right.variant === \"none\") return true;\n return equalKaladaValues(left.value, right.value);\n}\n\nfunction equalResults(left: KaladaValue, right: KaladaValue): boolean {\n if (!isResult(left) || !isResult(right) || left.variant !== right.variant) return false;\n return equalKaladaValues(left.value, right.value);\n}\n"]}
|