@kalada/core 0.0.0 → 0.2.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 (80) hide show
  1. package/README.md +25 -0
  2. package/dist/kalada-v1/canonicalize.cjs +266 -0
  3. package/dist/kalada-v1/canonicalize.cjs.map +1 -0
  4. package/dist/kalada-v1/canonicalize.d.cts +7 -0
  5. package/dist/kalada-v1/canonicalize.d.ts +7 -0
  6. package/dist/kalada-v1/canonicalize.js +264 -0
  7. package/dist/kalada-v1/canonicalize.js.map +1 -0
  8. package/dist/kalada-v1/codec.cjs +149 -0
  9. package/dist/kalada-v1/codec.cjs.map +1 -0
  10. package/dist/kalada-v1/codec.d.cts +27 -0
  11. package/dist/kalada-v1/codec.d.ts +27 -0
  12. package/dist/kalada-v1/codec.js +146 -0
  13. package/dist/kalada-v1/codec.js.map +1 -0
  14. package/dist/kalada-v1/compile.cjs +31 -0
  15. package/dist/kalada-v1/compile.cjs.map +1 -0
  16. package/dist/kalada-v1/compile.d.cts +7 -0
  17. package/dist/kalada-v1/compile.d.ts +7 -0
  18. package/dist/kalada-v1/compile.js +29 -0
  19. package/dist/kalada-v1/compile.js.map +1 -0
  20. package/dist/kalada-v1/dependencies.cjs +52 -0
  21. package/dist/kalada-v1/dependencies.cjs.map +1 -0
  22. package/dist/kalada-v1/dependencies.d.cts +7 -0
  23. package/dist/kalada-v1/dependencies.d.ts +7 -0
  24. package/dist/kalada-v1/dependencies.js +50 -0
  25. package/dist/kalada-v1/dependencies.js.map +1 -0
  26. package/dist/kalada-v1/diagnostics.cjs +44 -0
  27. package/dist/kalada-v1/diagnostics.cjs.map +1 -0
  28. package/dist/kalada-v1/diagnostics.d.cts +13 -0
  29. package/dist/kalada-v1/diagnostics.d.ts +13 -0
  30. package/dist/kalada-v1/diagnostics.js +40 -0
  31. package/dist/kalada-v1/diagnostics.js.map +1 -0
  32. package/dist/kalada-v1/evaluate.cjs +141 -0
  33. package/dist/kalada-v1/evaluate.cjs.map +1 -0
  34. package/dist/kalada-v1/evaluate.d.cts +7 -0
  35. package/dist/kalada-v1/evaluate.d.ts +7 -0
  36. package/dist/kalada-v1/evaluate.js +139 -0
  37. package/dist/kalada-v1/evaluate.js.map +1 -0
  38. package/dist/kalada-v1/factories.cjs +48 -0
  39. package/dist/kalada-v1/factories.cjs.map +1 -0
  40. package/dist/kalada-v1/factories.d.cts +22 -0
  41. package/dist/kalada-v1/factories.d.ts +22 -0
  42. package/dist/kalada-v1/factories.js +46 -0
  43. package/dist/kalada-v1/factories.js.map +1 -0
  44. package/dist/kalada-v1/index.cjs +71 -0
  45. package/dist/kalada-v1/index.cjs.map +1 -0
  46. package/dist/kalada-v1/index.d.cts +10 -0
  47. package/dist/kalada-v1/index.d.ts +10 -0
  48. package/dist/kalada-v1/index.js +10 -0
  49. package/dist/kalada-v1/index.js.map +1 -0
  50. package/dist/kalada-v1/json.cjs +129 -0
  51. package/dist/kalada-v1/json.cjs.map +1 -0
  52. package/dist/kalada-v1/json.d.cts +20 -0
  53. package/dist/kalada-v1/json.d.ts +20 -0
  54. package/dist/kalada-v1/json.js +123 -0
  55. package/dist/kalada-v1/json.js.map +1 -0
  56. package/dist/kalada-v1/limits.cjs +34 -0
  57. package/dist/kalada-v1/limits.cjs.map +1 -0
  58. package/dist/kalada-v1/limits.d.cts +8 -0
  59. package/dist/kalada-v1/limits.d.ts +8 -0
  60. package/dist/kalada-v1/limits.js +31 -0
  61. package/dist/kalada-v1/limits.js.map +1 -0
  62. package/dist/kalada-v1/schemas.cjs +154 -0
  63. package/dist/kalada-v1/schemas.cjs.map +1 -0
  64. package/dist/kalada-v1/schemas.d.cts +5 -0
  65. package/dist/kalada-v1/schemas.d.ts +5 -0
  66. package/dist/kalada-v1/schemas.js +151 -0
  67. package/dist/kalada-v1/schemas.js.map +1 -0
  68. package/dist/kalada-v1/types.cjs +4 -0
  69. package/dist/kalada-v1/types.cjs.map +1 -0
  70. package/dist/kalada-v1/types.d.cts +91 -0
  71. package/dist/kalada-v1/types.d.ts +91 -0
  72. package/dist/kalada-v1/types.js +3 -0
  73. package/dist/kalada-v1/types.js.map +1 -0
  74. package/dist/kalada-v1/values.cjs +100 -0
  75. package/dist/kalada-v1/values.cjs.map +1 -0
  76. package/dist/kalada-v1/values.d.cts +48 -0
  77. package/dist/kalada-v1/values.d.ts +48 -0
  78. package/dist/kalada-v1/values.js +93 -0
  79. package/dist/kalada-v1/values.js.map +1 -0
  80. package/package.json +16 -1
@@ -0,0 +1,100 @@
1
+ 'use strict';
2
+
3
+ var json_js = require('./json.js');
4
+
5
+ const optionBrands = /* @__PURE__ */ new WeakSet();
6
+ const resultBrands = /* @__PURE__ */ new WeakSet();
7
+ const DEFAULT_VALUE_LIMITS = Object.freeze({
8
+ maxDepth: 64,
9
+ maxNodes: 1e4,
10
+ maxStringLength: 1e4
11
+ });
12
+ function branded(brand, value) {
13
+ Object.freeze(value);
14
+ brand.add(value);
15
+ return value;
16
+ }
17
+ function snapshot(value) {
18
+ if (isOption(value) || isResult(value)) return value;
19
+ return json_js.cloneJson(value, DEFAULT_VALUE_LIMITS);
20
+ }
21
+ const NONE = branded(optionBrands, { type: "Option", variant: "none" });
22
+ const Option = Object.freeze({
23
+ some(value) {
24
+ return branded(optionBrands, {
25
+ type: "Option",
26
+ variant: "some",
27
+ value: snapshot(value)
28
+ });
29
+ },
30
+ none() {
31
+ return NONE;
32
+ }
33
+ });
34
+ const Result = Object.freeze({
35
+ ok(value) {
36
+ return branded(resultBrands, {
37
+ type: "Result",
38
+ variant: "ok",
39
+ value: snapshot(value)
40
+ });
41
+ },
42
+ err(value) {
43
+ return branded(resultBrands, {
44
+ type: "Result",
45
+ variant: "err",
46
+ value: snapshot(value)
47
+ });
48
+ }
49
+ });
50
+ function isOption(value) {
51
+ return typeof value === "object" && value !== null && optionBrands.has(value);
52
+ }
53
+ function isResult(value) {
54
+ return typeof value === "object" && value !== null && resultBrands.has(value);
55
+ }
56
+ function equalKaladaValues(left, right) {
57
+ if (isOption(left) || isOption(right)) return equalOptions(left, right);
58
+ if (isResult(left) || isResult(right)) return equalResults(left, right);
59
+ return json_js.deepEqualJson(left, right);
60
+ }
61
+ function validateKaladaValueLimits(value, limits) {
62
+ const seen = /* @__PURE__ */ new WeakSet();
63
+ let current = value;
64
+ let depth = 0;
65
+ let nodes = 0;
66
+ while (isOption(current) || isResult(current)) {
67
+ nodes += 1;
68
+ if (depth > limits.maxDepth || nodes > limits.maxNodes) throw new RangeError("limit");
69
+ if (seen.has(current)) throw new TypeError("cycle");
70
+ seen.add(current);
71
+ if (isOption(current) && current.variant === "none") return;
72
+ current = current.value;
73
+ depth += 1;
74
+ }
75
+ const remainingDepth = limits.maxDepth - depth;
76
+ if (remainingDepth < 0) throw new RangeError("limit");
77
+ json_js.cloneJsonWithStats(current, {
78
+ maxDepth: remainingDepth,
79
+ maxNodes: limits.maxNodes - nodes,
80
+ maxStringLength: limits.maxStringLength
81
+ });
82
+ }
83
+ function equalOptions(left, right) {
84
+ if (!isOption(left) || !isOption(right) || left.variant !== right.variant) return false;
85
+ if (left.variant === "none" || right.variant === "none") return true;
86
+ return equalKaladaValues(left.value, right.value);
87
+ }
88
+ function equalResults(left, right) {
89
+ if (!isResult(left) || !isResult(right) || left.variant !== right.variant) return false;
90
+ return equalKaladaValues(left.value, right.value);
91
+ }
92
+
93
+ exports.Option = Option;
94
+ exports.Result = Result;
95
+ exports.equalKaladaValues = equalKaladaValues;
96
+ exports.isOption = isOption;
97
+ exports.isResult = isResult;
98
+ exports.validateKaladaValueLimits = validateKaladaValueLimits;
99
+ //# sourceMappingURL=values.cjs.map
100
+ //# sourceMappingURL=values.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/values.ts"],"names":["cloneJson","deepEqualJson","cloneJsonWithStats"],"mappings":"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","file":"values.cjs","sourcesContent":["import { cloneJson, cloneJsonWithStats, deepEqualJson, type JsonValue } from \"./json.js\";\n\nexport type KaladaValue = JsonValue | OptionValue | ResultValue;\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)) 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 (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 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 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"]}
@@ -0,0 +1,48 @@
1
+ import { JsonValue } from './json.cjs';
2
+
3
+ type KaladaValue = JsonValue | OptionValue | ResultValue;
4
+ type OptionValue = SomeValue | NoneValue;
5
+ type ResultValue = OkValue | ErrValue;
6
+ declare const optionBrand: unique symbol;
7
+ declare const resultBrand: unique symbol;
8
+ interface SomeValue {
9
+ readonly [optionBrand]: true;
10
+ readonly type: "Option";
11
+ readonly variant: "some";
12
+ readonly value: KaladaValue;
13
+ }
14
+ interface NoneValue {
15
+ readonly [optionBrand]: true;
16
+ readonly type: "Option";
17
+ readonly variant: "none";
18
+ }
19
+ interface OkValue {
20
+ readonly [resultBrand]: true;
21
+ readonly type: "Result";
22
+ readonly variant: "ok";
23
+ readonly value: KaladaValue;
24
+ }
25
+ interface ErrValue {
26
+ readonly [resultBrand]: true;
27
+ readonly type: "Result";
28
+ readonly variant: "err";
29
+ readonly value: KaladaValue;
30
+ }
31
+ declare const Option: Readonly<{
32
+ some(value: KaladaValue): SomeValue;
33
+ none(): NoneValue;
34
+ }>;
35
+ declare const Result: Readonly<{
36
+ ok(value: KaladaValue): OkValue;
37
+ err(value: KaladaValue): ErrValue;
38
+ }>;
39
+ declare function isOption(value: unknown): value is OptionValue;
40
+ declare function isResult(value: unknown): value is ResultValue;
41
+ declare function equalKaladaValues(left: KaladaValue, right: KaladaValue): boolean;
42
+ declare function validateKaladaValueLimits(value: KaladaValue, limits: {
43
+ readonly maxDepth: number;
44
+ readonly maxNodes: number;
45
+ readonly maxStringLength: number;
46
+ }): void;
47
+
48
+ export { type ErrValue, type KaladaValue, type NoneValue, type OkValue, Option, type OptionValue, Result, type ResultValue, type SomeValue, equalKaladaValues, isOption, isResult, validateKaladaValueLimits };
@@ -0,0 +1,48 @@
1
+ import { JsonValue } from './json.js';
2
+
3
+ type KaladaValue = JsonValue | OptionValue | ResultValue;
4
+ type OptionValue = SomeValue | NoneValue;
5
+ type ResultValue = OkValue | ErrValue;
6
+ declare const optionBrand: unique symbol;
7
+ declare const resultBrand: unique symbol;
8
+ interface SomeValue {
9
+ readonly [optionBrand]: true;
10
+ readonly type: "Option";
11
+ readonly variant: "some";
12
+ readonly value: KaladaValue;
13
+ }
14
+ interface NoneValue {
15
+ readonly [optionBrand]: true;
16
+ readonly type: "Option";
17
+ readonly variant: "none";
18
+ }
19
+ interface OkValue {
20
+ readonly [resultBrand]: true;
21
+ readonly type: "Result";
22
+ readonly variant: "ok";
23
+ readonly value: KaladaValue;
24
+ }
25
+ interface ErrValue {
26
+ readonly [resultBrand]: true;
27
+ readonly type: "Result";
28
+ readonly variant: "err";
29
+ readonly value: KaladaValue;
30
+ }
31
+ declare const Option: Readonly<{
32
+ some(value: KaladaValue): SomeValue;
33
+ none(): NoneValue;
34
+ }>;
35
+ declare const Result: Readonly<{
36
+ ok(value: KaladaValue): OkValue;
37
+ err(value: KaladaValue): ErrValue;
38
+ }>;
39
+ declare function isOption(value: unknown): value is OptionValue;
40
+ declare function isResult(value: unknown): value is ResultValue;
41
+ declare function equalKaladaValues(left: KaladaValue, right: KaladaValue): boolean;
42
+ declare function validateKaladaValueLimits(value: KaladaValue, limits: {
43
+ readonly maxDepth: number;
44
+ readonly maxNodes: number;
45
+ readonly maxStringLength: number;
46
+ }): void;
47
+
48
+ export { type ErrValue, type KaladaValue, type NoneValue, type OkValue, Option, type OptionValue, Result, type ResultValue, type SomeValue, equalKaladaValues, isOption, isResult, validateKaladaValueLimits };
@@ -0,0 +1,93 @@
1
+ import { deepEqualJson, cloneJsonWithStats, cloneJson } from './json.js';
2
+
3
+ const optionBrands = /* @__PURE__ */ new WeakSet();
4
+ const resultBrands = /* @__PURE__ */ new WeakSet();
5
+ const DEFAULT_VALUE_LIMITS = Object.freeze({
6
+ maxDepth: 64,
7
+ maxNodes: 1e4,
8
+ maxStringLength: 1e4
9
+ });
10
+ function branded(brand, value) {
11
+ Object.freeze(value);
12
+ brand.add(value);
13
+ return value;
14
+ }
15
+ function snapshot(value) {
16
+ if (isOption(value) || isResult(value)) return value;
17
+ return cloneJson(value, DEFAULT_VALUE_LIMITS);
18
+ }
19
+ const NONE = branded(optionBrands, { type: "Option", variant: "none" });
20
+ const Option = Object.freeze({
21
+ some(value) {
22
+ return branded(optionBrands, {
23
+ type: "Option",
24
+ variant: "some",
25
+ value: snapshot(value)
26
+ });
27
+ },
28
+ none() {
29
+ return NONE;
30
+ }
31
+ });
32
+ const Result = Object.freeze({
33
+ ok(value) {
34
+ return branded(resultBrands, {
35
+ type: "Result",
36
+ variant: "ok",
37
+ value: snapshot(value)
38
+ });
39
+ },
40
+ err(value) {
41
+ return branded(resultBrands, {
42
+ type: "Result",
43
+ variant: "err",
44
+ value: snapshot(value)
45
+ });
46
+ }
47
+ });
48
+ function isOption(value) {
49
+ return typeof value === "object" && value !== null && optionBrands.has(value);
50
+ }
51
+ function isResult(value) {
52
+ return typeof value === "object" && value !== null && resultBrands.has(value);
53
+ }
54
+ function equalKaladaValues(left, right) {
55
+ if (isOption(left) || isOption(right)) return equalOptions(left, right);
56
+ if (isResult(left) || isResult(right)) return equalResults(left, right);
57
+ return deepEqualJson(left, right);
58
+ }
59
+ function validateKaladaValueLimits(value, limits) {
60
+ const seen = /* @__PURE__ */ new WeakSet();
61
+ let current = value;
62
+ let depth = 0;
63
+ let nodes = 0;
64
+ while (isOption(current) || isResult(current)) {
65
+ nodes += 1;
66
+ if (depth > limits.maxDepth || nodes > limits.maxNodes) throw new RangeError("limit");
67
+ if (seen.has(current)) throw new TypeError("cycle");
68
+ seen.add(current);
69
+ if (isOption(current) && current.variant === "none") return;
70
+ current = current.value;
71
+ depth += 1;
72
+ }
73
+ const remainingDepth = limits.maxDepth - depth;
74
+ if (remainingDepth < 0) throw new RangeError("limit");
75
+ cloneJsonWithStats(current, {
76
+ maxDepth: remainingDepth,
77
+ maxNodes: limits.maxNodes - nodes,
78
+ maxStringLength: limits.maxStringLength
79
+ });
80
+ }
81
+ function equalOptions(left, right) {
82
+ if (!isOption(left) || !isOption(right) || left.variant !== right.variant) return false;
83
+ if (left.variant === "none" || right.variant === "none") return true;
84
+ return equalKaladaValues(left.value, right.value);
85
+ }
86
+ function equalResults(left, right) {
87
+ if (!isResult(left) || !isResult(right) || left.variant !== right.variant) return false;
88
+ return equalKaladaValues(left.value, right.value);
89
+ }
90
+
91
+ export { Option, Result, equalKaladaValues, isOption, isResult, validateKaladaValueLimits };
92
+ //# sourceMappingURL=values.js.map
93
+ //# sourceMappingURL=values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/values.ts"],"names":[],"mappings":";;AAoCA,MAAM,YAAA,uBAAmB,OAAA,EAAgB;AACzC,MAAM,YAAA,uBAAmB,OAAA,EAAgB;AACzC,MAAM,oBAAA,GAAuB,OAAO,MAAA,CAAO;AAAA,EACzC,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,GAAA;AAAA,EACV,eAAA,EAAiB;AACnB,CAAC,CAAA;AAED,SAAS,OAAA,CAA0B,OAAwB,KAAA,EAAa;AACtE,EAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AACnB,EAAA,KAAA,CAAM,IAAI,KAAK,CAAA;AACf,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAS,KAAA,EAAiC;AACjD,EAAA,IAAI,SAAS,KAAK,CAAA,IAAK,QAAA,CAAS,KAAK,GAAG,OAAO,KAAA;AAC/C,EAAA,OAAO,SAAA,CAAU,OAAO,oBAAoB,CAAA;AAC9C;AAEA,MAAM,IAAA,GAAO,QAAQ,YAAA,EAAc,EAAE,MAAM,QAAA,EAAU,OAAA,EAAS,QAAgC,CAAA;AAEvF,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO;AAAA,EAClC,KAAK,KAAA,EAA+B;AAClC,IAAA,OAAO,QAAQ,YAAA,EAAc;AAAA,MAC3B,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,MAAA;AAAA,MACT,KAAA,EAAO,SAAS,KAAK;AAAA,KACE,CAAA;AAAA,EAC3B,CAAA;AAAA,EACA,IAAA,GAAkB;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAC;AAEM,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO;AAAA,EAClC,GAAG,KAAA,EAA6B;AAC9B,IAAA,OAAO,QAAQ,YAAA,EAAc;AAAA,MAC3B,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAO,SAAS,KAAK;AAAA,KACA,CAAA;AAAA,EACzB,CAAA;AAAA,EACA,IAAI,KAAA,EAA8B;AAChC,IAAA,OAAO,QAAQ,YAAA,EAAc;AAAA,MAC3B,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,SAAS,KAAK;AAAA,KACC,CAAA;AAAA,EAC1B;AACF,CAAC;AAEM,SAAS,SAAS,KAAA,EAAsC;AAC7D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,YAAA,CAAa,IAAI,KAAK,CAAA;AAC9E;AAEO,SAAS,SAAS,KAAA,EAAsC;AAC7D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,YAAA,CAAa,IAAI,KAAK,CAAA;AAC9E;AAEO,SAAS,iBAAA,CAAkB,MAAmB,KAAA,EAA6B;AAChF,EAAA,IAAI,QAAA,CAAS,IAAI,CAAA,IAAK,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,YAAA,CAAa,IAAA,EAAM,KAAK,CAAA;AACtE,EAAA,IAAI,QAAA,CAAS,IAAI,CAAA,IAAK,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,YAAA,CAAa,IAAA,EAAM,KAAK,CAAA;AACtE,EAAA,OAAO,aAAA,CAAc,MAAM,KAAK,CAAA;AAClC;AAEO,SAAS,yBAAA,CACd,OACA,MAAA,EAKM;AACN,EAAA,MAAM,IAAA,uBAAW,OAAA,EAAgB;AACjC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,QAAA,CAAS,OAAO,CAAA,IAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC7C,IAAA,KAAA,IAAS,CAAA;AACT,IAAA,IAAI,KAAA,GAAQ,OAAO,QAAA,IAAY,KAAA,GAAQ,OAAO,QAAA,EAAU,MAAM,IAAI,UAAA,CAAW,OAAO,CAAA;AACpF,IAAA,IAAI,KAAK,GAAA,CAAI,OAAO,GAAG,MAAM,IAAI,UAAU,OAAO,CAAA;AAClD,IAAA,IAAA,CAAK,IAAI,OAAO,CAAA;AAChB,IAAA,IAAI,QAAA,CAAS,OAAO,CAAA,IAAK,OAAA,CAAQ,YAAY,MAAA,EAAQ;AACrD,IAAA,OAAA,GAAU,OAAA,CAAQ,KAAA;AAClB,IAAA,KAAA,IAAS,CAAA;AAAA,EACX;AACA,EAAA,MAAM,cAAA,GAAiB,OAAO,QAAA,GAAW,KAAA;AACzC,EAAA,IAAI,cAAA,GAAiB,CAAA,EAAG,MAAM,IAAI,WAAW,OAAO,CAAA;AACpD,EAAA,kBAAA,CAAmB,OAAA,EAAS;AAAA,IAC1B,QAAA,EAAU,cAAA;AAAA,IACV,QAAA,EAAU,OAAO,QAAA,GAAW,KAAA;AAAA,IAC5B,iBAAiB,MAAA,CAAO;AAAA,GACzB,CAAA;AACH;AAEA,SAAS,YAAA,CAAa,MAAmB,KAAA,EAA6B;AACpE,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,CAAC,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,OAAA,KAAY,KAAA,CAAM,OAAA,EAAS,OAAO,KAAA;AAClF,EAAA,IAAI,KAAK,OAAA,KAAY,MAAA,IAAU,KAAA,CAAM,OAAA,KAAY,QAAQ,OAAO,IAAA;AAChE,EAAA,OAAO,iBAAA,CAAkB,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA;AAClD;AAEA,SAAS,YAAA,CAAa,MAAmB,KAAA,EAA6B;AACpE,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,CAAC,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,OAAA,KAAY,KAAA,CAAM,OAAA,EAAS,OAAO,KAAA;AAClF,EAAA,OAAO,iBAAA,CAAkB,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA;AAClD","file":"values.js","sourcesContent":["import { cloneJson, cloneJsonWithStats, deepEqualJson, type JsonValue } from \"./json.js\";\n\nexport type KaladaValue = JsonValue | OptionValue | ResultValue;\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)) 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 (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 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 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"]}
package/package.json CHANGED
@@ -1,8 +1,13 @@
1
1
  {
2
2
  "name": "@kalada/core",
3
- "version": "0.0.0",
3
+ "version": "0.2.0",
4
4
  "description": "Canonical runtime contracts for the Kalada expression language",
5
5
  "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/surikaterna/kalada",
9
+ "directory": "packages/core"
10
+ },
6
11
  "type": "module",
7
12
  "sideEffects": false,
8
13
  "files": [
@@ -35,6 +40,16 @@
35
40
  "default": "./dist/kuery-v1/index.cjs"
36
41
  }
37
42
  },
43
+ "./kalada-v1": {
44
+ "import": {
45
+ "types": "./dist/kalada-v1/index.d.ts",
46
+ "default": "./dist/kalada-v1/index.js"
47
+ },
48
+ "require": {
49
+ "types": "./dist/kalada-v1/index.d.cts",
50
+ "default": "./dist/kalada-v1/index.cjs"
51
+ }
52
+ },
38
53
  "./package.json": "./package.json"
39
54
  },
40
55
  "scripts": {