@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.
- package/README.md +25 -0
- package/dist/kalada-v1/canonicalize.cjs +266 -0
- package/dist/kalada-v1/canonicalize.cjs.map +1 -0
- package/dist/kalada-v1/canonicalize.d.cts +7 -0
- package/dist/kalada-v1/canonicalize.d.ts +7 -0
- package/dist/kalada-v1/canonicalize.js +264 -0
- package/dist/kalada-v1/canonicalize.js.map +1 -0
- package/dist/kalada-v1/codec.cjs +149 -0
- package/dist/kalada-v1/codec.cjs.map +1 -0
- package/dist/kalada-v1/codec.d.cts +27 -0
- package/dist/kalada-v1/codec.d.ts +27 -0
- package/dist/kalada-v1/codec.js +146 -0
- package/dist/kalada-v1/codec.js.map +1 -0
- package/dist/kalada-v1/compile.cjs +31 -0
- package/dist/kalada-v1/compile.cjs.map +1 -0
- package/dist/kalada-v1/compile.d.cts +7 -0
- package/dist/kalada-v1/compile.d.ts +7 -0
- package/dist/kalada-v1/compile.js +29 -0
- package/dist/kalada-v1/compile.js.map +1 -0
- package/dist/kalada-v1/dependencies.cjs +52 -0
- package/dist/kalada-v1/dependencies.cjs.map +1 -0
- package/dist/kalada-v1/dependencies.d.cts +7 -0
- package/dist/kalada-v1/dependencies.d.ts +7 -0
- package/dist/kalada-v1/dependencies.js +50 -0
- package/dist/kalada-v1/dependencies.js.map +1 -0
- package/dist/kalada-v1/diagnostics.cjs +44 -0
- package/dist/kalada-v1/diagnostics.cjs.map +1 -0
- package/dist/kalada-v1/diagnostics.d.cts +13 -0
- package/dist/kalada-v1/diagnostics.d.ts +13 -0
- package/dist/kalada-v1/diagnostics.js +40 -0
- package/dist/kalada-v1/diagnostics.js.map +1 -0
- package/dist/kalada-v1/evaluate.cjs +141 -0
- package/dist/kalada-v1/evaluate.cjs.map +1 -0
- package/dist/kalada-v1/evaluate.d.cts +7 -0
- package/dist/kalada-v1/evaluate.d.ts +7 -0
- package/dist/kalada-v1/evaluate.js +139 -0
- package/dist/kalada-v1/evaluate.js.map +1 -0
- package/dist/kalada-v1/factories.cjs +48 -0
- package/dist/kalada-v1/factories.cjs.map +1 -0
- package/dist/kalada-v1/factories.d.cts +22 -0
- package/dist/kalada-v1/factories.d.ts +22 -0
- package/dist/kalada-v1/factories.js +46 -0
- package/dist/kalada-v1/factories.js.map +1 -0
- package/dist/kalada-v1/index.cjs +71 -0
- package/dist/kalada-v1/index.cjs.map +1 -0
- package/dist/kalada-v1/index.d.cts +10 -0
- package/dist/kalada-v1/index.d.ts +10 -0
- package/dist/kalada-v1/index.js +10 -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 +8 -0
- package/dist/kalada-v1/limits.d.ts +8 -0
- package/dist/kalada-v1/limits.js +31 -0
- package/dist/kalada-v1/limits.js.map +1 -0
- package/dist/kalada-v1/schemas.cjs +154 -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 +151 -0
- package/dist/kalada-v1/schemas.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 +91 -0
- package/dist/kalada-v1/types.d.ts +91 -0
- package/dist/kalada-v1/types.js +3 -0
- package/dist/kalada-v1/types.js.map +1 -0
- package/dist/kalada-v1/values.cjs +100 -0
- package/dist/kalada-v1/values.cjs.map +1 -0
- package/dist/kalada-v1/values.d.cts +48 -0
- package/dist/kalada-v1/values.d.ts +48 -0
- package/dist/kalada-v1/values.js +93 -0
- package/dist/kalada-v1/values.js.map +1 -0
- package/package.json +16 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/canonicalize.ts"],"names":[],"mappings":"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","file":"canonicalize.js","sourcesContent":["import { failure, KaladaFailure, success } from \"./diagnostics.js\";\nimport {\n canonicalJsonIdentity,\n cloneJson,\n cloneJsonWithStats,\n dataValue,\n type JsonValue,\n} from \"./json.js\";\nimport { resolveLimits } from \"./limits.js\";\nimport type {\n KaladaV1Expression,\n KaladaV1Limits,\n KaladaV1Options,\n KaladaV1Outcome,\n KaladaV1Program,\n MatchArm,\n} from \"./types.js\";\n\ntype Path = readonly (string | number)[];\ninterface State<R extends JsonValue> {\n readonly limits: KaladaV1Limits;\n readonly options: KaladaV1Options<R>;\n readonly active: WeakSet<object>;\n astNodes: number;\n valueNodes: number;\n}\n\nconst NODE_KEYS = new Set([\"kind\", \"value\", \"ref\", \"name\", \"body\", \"variant\", \"type\", \"arms\"]);\nconst ARM_ORDER = Object.freeze({ Option: [\"some\", \"none\"], Result: [\"ok\", \"err\"] } as const);\n\nexport function canonicalizeKaladaV1Program<R extends JsonValue = string>(\n input: unknown,\n options: KaladaV1Options<R> = {},\n): KaladaV1Outcome<KaladaV1Program<R>> {\n try {\n const limits = resolveLimits(options.limits);\n const fields = properties(input, [], new Set([\"format\", \"version\", \"profile\", \"expression\"]));\n if (\n fields.format !== \"kalada-program\" ||\n fields.version !== 1 ||\n fields.profile !== \"kalada-v1\"\n ) {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", []);\n }\n const state: State<R> = {\n limits,\n options,\n active: new WeakSet(),\n astNodes: 0,\n valueNodes: 0,\n };\n const expression = canonicalNode(fields.expression, [\"expression\"], 0, state);\n return success(\n Object.freeze({ format: \"kalada-program\", version: 1, profile: \"kalada-v1\", expression }),\n );\n } catch (error) {\n const problem =\n error instanceof KaladaFailure ? error : new KaladaFailure(\"KALADA_INVALID_INPUT\", []);\n return failure(problem.code, problem.path);\n }\n}\n\nfunction canonicalNode<R extends JsonValue>(\n input: unknown,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n count(path, depth, state);\n if (typeof input !== \"object\" || input === null || state.active.has(input)) {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n }\n state.active.add(input);\n try {\n const raw = properties(input, path, NODE_KEYS, false);\n if (raw.kind === \"literal\") return canonicalLiteral(raw, path, state);\n if (raw.kind === \"ref\") return canonicalReference(raw, path, state);\n if (raw.kind === \"binding\") return canonicalBinding(raw, path, depth, state);\n if (raw.kind === \"option\") return canonicalOption(raw, path, depth, state);\n if (raw.kind === \"result\") return canonicalResult(raw, path, depth, state);\n if (raw.kind === \"match\") return canonicalMatch(raw, path, depth, state);\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"kind\"]);\n } finally {\n state.active.delete(input);\n }\n}\n\nfunction canonicalLiteral<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n state: State<R>,\n): KaladaV1Expression<R> {\n exact(raw, path, [\"kind\", \"value\"]);\n return Object.freeze({\n kind: \"literal\",\n value: safeJson(raw.value, [...path, \"value\"], state),\n });\n}\n\nfunction canonicalReference<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n state: State<R>,\n): KaladaV1Expression<R> {\n exact(raw, path, [\"kind\", \"ref\"]);\n const refPath = [...path, \"ref\"];\n const codec = state.options.reference;\n const ref = (\n codec ? inspectJson(raw.ref, refPath, state) : safeJson(raw.ref, refPath, state)\n ) as R;\n if (codec ? !safeValidate(codec.validate, ref) : typeof ref !== \"string\" || ref.length === 0) {\n throw new KaladaFailure(\"KALADA_INVALID_REFERENCE\", refPath);\n }\n const replacement = codec?.canonicalize\n ? safeCanonicalize(codec.canonicalize, ref, refPath)\n : ref;\n const output = (codec ? safeJson(replacement, refPath, state) : replacement) as R;\n if (codec && !safeValidate(codec.validate, output))\n throw new KaladaFailure(\"KALADA_INVALID_REFERENCE\", refPath);\n if (referenceLength(output) > state.limits.maxReferenceLength)\n throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", refPath);\n return Object.freeze({ kind: \"ref\", ref: output });\n}\n\nfunction canonicalBinding<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n exact(raw, path, [\"kind\", \"name\", \"value\", \"body\"]);\n const name = bindingName(raw.name, [...path, \"name\"], state.limits);\n return Object.freeze({\n kind: \"binding\",\n name,\n value: canonicalNode(raw.value, [...path, \"value\"], depth + 1, state),\n body: canonicalNode(raw.body, [...path, \"body\"], depth + 1, state),\n });\n}\n\nfunction canonicalOption<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n if (raw.variant === \"none\") {\n exact(raw, path, [\"kind\", \"variant\"]);\n return Object.freeze({ kind: \"option\", variant: \"none\" });\n }\n if (raw.variant !== \"some\") throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"variant\"]);\n exact(raw, path, [\"kind\", \"variant\", \"value\"]);\n return Object.freeze({\n kind: \"option\",\n variant: \"some\",\n value: canonicalNode(raw.value, [...path, \"value\"], depth + 1, state),\n });\n}\n\nfunction canonicalResult<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n if (raw.variant !== \"ok\" && raw.variant !== \"err\")\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"variant\"]);\n exact(raw, path, [\"kind\", \"variant\", \"value\"]);\n return Object.freeze({\n kind: \"result\",\n variant: raw.variant,\n value: canonicalNode(raw.value, [...path, \"value\"], depth + 1, state),\n });\n}\n\nfunction canonicalMatch<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: State<R>,\n): KaladaV1Expression<R> {\n exact(raw, path, [\"kind\", \"type\", \"value\", \"arms\"]);\n if (raw.type !== \"Option\" && raw.type !== \"Result\")\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"type\"]);\n const value = canonicalNode(raw.value, [...path, \"value\"], depth + 1, state);\n const arms = canonicalArms(raw.arms, raw.type, path, depth, state);\n return Object.freeze({ kind: \"match\", type: raw.type, value, arms });\n}\n\nfunction canonicalArms<R extends JsonValue>(\n input: unknown,\n type: \"Option\" | \"Result\",\n path: Path,\n depth: number,\n state: State<R>,\n): readonly MatchArm<R>[] {\n if (!Array.isArray(input)) throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"arms\"]);\n const entries = strictArray(input, [...path, \"arms\"]);\n const expected: readonly string[] = ARM_ORDER[type];\n const found = new Map<string, MatchArm<R>>();\n entries.forEach((entry, index) => {\n addArm(entry, index, type, expected, found, path, depth, state);\n });\n if (found.size !== expected.length)\n throw new KaladaFailure(\"KALADA_MATCH_MISSING_ARM\", [...path, \"arms\"]);\n return Object.freeze(expected.map((variant) => requiredArm(found, variant, path)));\n}\n\nfunction addArm<R extends JsonValue>(\n input: unknown,\n index: number,\n type: \"Option\" | \"Result\",\n expected: readonly string[],\n found: Map<string, MatchArm<R>>,\n path: Path,\n depth: number,\n state: State<R>,\n): void {\n const armPath = [...path, \"arms\", index];\n const raw = properties(input, armPath, new Set([\"variant\", \"binding\", \"body\"]), false);\n if (found.size === expected.length)\n throw new KaladaFailure(\"KALADA_MATCH_UNREACHABLE_ARM\", armPath);\n if (typeof raw.variant !== \"string\" || !expected.includes(raw.variant))\n throw new KaladaFailure(\"KALADA_MATCH_UNKNOWN_ARM\", [...armPath, \"variant\"]);\n if (found.has(raw.variant))\n throw new KaladaFailure(\"KALADA_MATCH_DUPLICATE_ARM\", [...armPath, \"variant\"]);\n const allowsBinding = raw.variant !== \"none\";\n if (!allowsBinding && \"binding\" in raw)\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...armPath, \"binding\"]);\n exact(\n raw,\n armPath,\n allowsBinding ? [\"variant\", \"body\", \"binding\"] : [\"variant\", \"body\"],\n allowsBinding,\n );\n const binding =\n raw.binding === undefined\n ? undefined\n : bindingName(raw.binding, [...armPath, \"binding\"], state.limits);\n const body = canonicalNode(raw.body, [...armPath, \"body\"], depth + 1, state);\n found.set(\n raw.variant,\n Object.freeze({ variant: raw.variant, ...(binding ? { binding } : {}), body }) as MatchArm<R>,\n );\n void type;\n}\n\nfunction requiredArm<R extends JsonValue>(\n found: Map<string, MatchArm<R>>,\n variant: string,\n path: Path,\n): MatchArm<R> {\n const arm = found.get(variant);\n if (!arm) throw new KaladaFailure(\"KALADA_MATCH_MISSING_ARM\", [...path, \"arms\"]);\n return arm;\n}\n\nfunction properties(\n input: unknown,\n path: Path,\n allowed: ReadonlySet<string>,\n requireExact = true,\n): Record<string, unknown> {\n if (typeof input !== \"object\" || input === null || Array.isArray(input))\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n let keys: PropertyKey[];\n try {\n keys = Reflect.ownKeys(input);\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n }\n const output: Record<string, unknown> = {};\n for (const key of keys) {\n if (typeof key !== \"string\" || !allowed.has(key))\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, String(key)]);\n try {\n output[key] = dataValue(input, key);\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, key]);\n }\n }\n if (requireExact && keys.length !== allowed.size)\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n return output;\n}\n\nfunction exact(\n raw: Record<string, unknown>,\n path: Path,\n keys: readonly string[],\n optionalLast = false,\n): void {\n const minimum = optionalLast ? keys.length - 1 : keys.length;\n if (Object.keys(raw).length < minimum || Object.keys(raw).length > keys.length)\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n for (let index = 0; index < minimum; index += 1) {\n const key = keys[index];\n if (key !== undefined && !(key in raw))\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, key]);\n }\n for (const key of Object.keys(raw))\n if (!keys.includes(key)) throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, key]);\n}\n\nfunction strictArray(input: unknown[], path: Path): unknown[] {\n let keys: PropertyKey[];\n try {\n keys = Reflect.ownKeys(input);\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n }\n if (keys.length !== input.length + 1) throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n return Array.from({ length: input.length }, (_, index) => {\n try {\n return dataValue(input, String(index));\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, index]);\n }\n });\n}\n\nfunction safeJson<R extends JsonValue>(input: unknown, path: Path, state: State<R>): JsonValue {\n try {\n const result = cloneJsonWithStats(input, {\n maxDepth: state.limits.maxValueDepth,\n maxNodes: state.limits.maxValueNodes - state.valueNodes,\n maxStringLength: state.limits.maxStringLength,\n });\n state.valueNodes += result.nodes;\n return result.value;\n } catch (error) {\n if (error instanceof RangeError) throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n }\n}\n\nfunction inspectJson<R extends JsonValue>(input: unknown, path: Path, state: State<R>): JsonValue {\n try {\n return cloneJson(input, {\n maxDepth: state.limits.maxValueDepth,\n maxNodes: state.limits.maxValueNodes,\n maxStringLength: state.limits.maxStringLength,\n });\n } catch (error) {\n if (error instanceof RangeError) throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n }\n}\n\nfunction referenceLength(reference: JsonValue): number {\n return typeof reference === \"string\"\n ? [...reference].length\n : [...canonicalJsonIdentity(reference)].length;\n}\n\nfunction bindingName(input: unknown, path: Path, limits: KaladaV1Limits): string {\n if (typeof input !== \"string\" || input.length === 0)\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n if ([...input].length > limits.maxReferenceLength)\n throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n return input;\n}\n\nfunction safeValidate<R>(validate: (input: unknown) => input is R, input: unknown): input is R {\n try {\n return validate(input) === true;\n } catch {\n return false;\n }\n}\n\nfunction safeCanonicalize<R>(canonicalize: (input: R) => R, input: R, path: Path): R {\n try {\n return canonicalize(input);\n } catch {\n throw new KaladaFailure(\"KALADA_INVALID_REFERENCE\", path);\n }\n}\n\nfunction count<R extends JsonValue>(path: Path, depth: number, state: State<R>): void {\n state.astNodes += 1;\n if (depth > state.limits.maxAstDepth || state.astNodes > state.limits.maxAstNodes)\n throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n}\n"]}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var json_js = require('./json.js');
|
|
4
|
+
var limits_js = require('./limits.js');
|
|
5
|
+
var values_js = require('./values.js');
|
|
6
|
+
|
|
7
|
+
const INVALID = "Invalid kalada-value v1 envelope.";
|
|
8
|
+
const LIMITS = Object.freeze({
|
|
9
|
+
maxDepth: limits_js.DEFAULT_KALADA_V1_LIMITS.maxValueDepth,
|
|
10
|
+
maxNodes: limits_js.DEFAULT_KALADA_V1_LIMITS.maxValueNodes,
|
|
11
|
+
maxStringLength: limits_js.DEFAULT_KALADA_V1_LIMITS.maxStringLength
|
|
12
|
+
});
|
|
13
|
+
function encodeKaladaValue(value) {
|
|
14
|
+
const frames = [];
|
|
15
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
16
|
+
let current = value;
|
|
17
|
+
let nodes = 0;
|
|
18
|
+
while (values_js.isOption(current) || values_js.isResult(current)) {
|
|
19
|
+
nodes = charge(nodes, frames.length);
|
|
20
|
+
if (seen.has(current)) throw new TypeError(INVALID);
|
|
21
|
+
seen.add(current);
|
|
22
|
+
if (values_js.isOption(current) && current.variant === "none") {
|
|
23
|
+
return wrapFrames(frozenNone(), frames);
|
|
24
|
+
}
|
|
25
|
+
frames.push({ type: current.type, variant: current.variant });
|
|
26
|
+
current = current.value;
|
|
27
|
+
}
|
|
28
|
+
const remaining = LIMITS.maxNodes - charge(nodes, frames.length);
|
|
29
|
+
const json = json_js.cloneJsonWithStats(current, {
|
|
30
|
+
...LIMITS,
|
|
31
|
+
maxDepth: remainingDepth(frames.length),
|
|
32
|
+
maxNodes: remaining
|
|
33
|
+
});
|
|
34
|
+
return wrapFrames(frozenJson(json.value), frames);
|
|
35
|
+
}
|
|
36
|
+
function decodeKaladaValue(input) {
|
|
37
|
+
const frames = [];
|
|
38
|
+
const active = /* @__PURE__ */ new WeakSet();
|
|
39
|
+
let current = input;
|
|
40
|
+
let nodes = 0;
|
|
41
|
+
while (true) {
|
|
42
|
+
nodes = charge(nodes, frames.length);
|
|
43
|
+
const envelope = envelopeObject(current);
|
|
44
|
+
if (active.has(envelope)) throw new TypeError(INVALID);
|
|
45
|
+
active.add(envelope);
|
|
46
|
+
const fields = envelopeFields(envelope);
|
|
47
|
+
if (fields.type === "Json" && fields.variant === "value") {
|
|
48
|
+
assertKeys(envelope, ["format", "version", "type", "variant", "value"]);
|
|
49
|
+
const value = decodeJson(json_js.dataValue(envelope, "value"), nodes, frames.length);
|
|
50
|
+
return wrapValues(value, frames);
|
|
51
|
+
}
|
|
52
|
+
if (fields.type === "Option" && fields.variant === "none") {
|
|
53
|
+
assertKeys(envelope, ["format", "version", "type", "variant"]);
|
|
54
|
+
return wrapValues(values_js.Option.none(), frames);
|
|
55
|
+
}
|
|
56
|
+
frames.push(payloadFrame(fields.type, fields.variant));
|
|
57
|
+
assertKeys(envelope, ["format", "version", "type", "variant", "value"]);
|
|
58
|
+
current = json_js.dataValue(envelope, "value");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function decodeJson(input, nodes, depth) {
|
|
62
|
+
return json_js.cloneJson(input, {
|
|
63
|
+
...LIMITS,
|
|
64
|
+
maxDepth: remainingDepth(depth),
|
|
65
|
+
maxNodes: LIMITS.maxNodes - nodes
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function envelopeObject(input) {
|
|
69
|
+
if (typeof input !== "object" || input === null || Array.isArray(input))
|
|
70
|
+
throw new TypeError(INVALID);
|
|
71
|
+
try {
|
|
72
|
+
const prototype = Object.getPrototypeOf(input);
|
|
73
|
+
if (prototype !== Object.prototype && prototype !== null) throw new TypeError(INVALID);
|
|
74
|
+
return input;
|
|
75
|
+
} catch {
|
|
76
|
+
throw new TypeError(INVALID);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function envelopeFields(input) {
|
|
80
|
+
try {
|
|
81
|
+
if (json_js.dataValue(input, "format") !== "kalada-value" || json_js.dataValue(input, "version") !== 1) {
|
|
82
|
+
throw new TypeError(INVALID);
|
|
83
|
+
}
|
|
84
|
+
return { type: json_js.dataValue(input, "type"), variant: json_js.dataValue(input, "variant") };
|
|
85
|
+
} catch {
|
|
86
|
+
throw new TypeError(INVALID);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function payloadFrame(type, variant) {
|
|
90
|
+
if (type === "Option" && variant === "some") return { type, variant };
|
|
91
|
+
if (type === "Result" && (variant === "ok" || variant === "err")) return { type, variant };
|
|
92
|
+
throw new TypeError(INVALID);
|
|
93
|
+
}
|
|
94
|
+
function assertKeys(input, expected) {
|
|
95
|
+
let keys;
|
|
96
|
+
try {
|
|
97
|
+
keys = Reflect.ownKeys(input);
|
|
98
|
+
} catch {
|
|
99
|
+
throw new TypeError(INVALID);
|
|
100
|
+
}
|
|
101
|
+
if (keys.length !== expected.length || !keys.every((key) => typeof key === "string" && expected.includes(key))) {
|
|
102
|
+
throw new TypeError(INVALID);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function wrapFrames(leaf, frames) {
|
|
106
|
+
let output = leaf;
|
|
107
|
+
for (let index = frames.length - 1; index >= 0; index -= 1) {
|
|
108
|
+
const frame = frames[index];
|
|
109
|
+
if (!frame) throw new TypeError(INVALID);
|
|
110
|
+
output = Object.freeze({ format: "kalada-value", version: 1, ...frame, value: output });
|
|
111
|
+
}
|
|
112
|
+
return output;
|
|
113
|
+
}
|
|
114
|
+
function wrapValues(leaf, frames) {
|
|
115
|
+
let output = leaf;
|
|
116
|
+
for (let index = frames.length - 1; index >= 0; index -= 1) {
|
|
117
|
+
const frame = frames[index];
|
|
118
|
+
if (!frame) throw new TypeError(INVALID);
|
|
119
|
+
output = frame.type === "Option" ? values_js.Option.some(output) : frame.variant === "ok" ? values_js.Result.ok(output) : values_js.Result.err(output);
|
|
120
|
+
}
|
|
121
|
+
return output;
|
|
122
|
+
}
|
|
123
|
+
function charge(nodes, depth) {
|
|
124
|
+
if (depth > LIMITS.maxDepth || nodes >= LIMITS.maxNodes)
|
|
125
|
+
throw new RangeError("Kalada value exceeds its limits.");
|
|
126
|
+
return nodes + 1;
|
|
127
|
+
}
|
|
128
|
+
function remainingDepth(depth) {
|
|
129
|
+
const remaining = LIMITS.maxDepth - depth;
|
|
130
|
+
if (remaining < 0) throw new RangeError("Kalada value exceeds its limits.");
|
|
131
|
+
return remaining;
|
|
132
|
+
}
|
|
133
|
+
function frozenNone() {
|
|
134
|
+
return Object.freeze({ format: "kalada-value", version: 1, type: "Option", variant: "none" });
|
|
135
|
+
}
|
|
136
|
+
function frozenJson(value) {
|
|
137
|
+
return Object.freeze({
|
|
138
|
+
format: "kalada-value",
|
|
139
|
+
version: 1,
|
|
140
|
+
type: "Json",
|
|
141
|
+
variant: "value",
|
|
142
|
+
value
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
exports.decodeKaladaValue = decodeKaladaValue;
|
|
147
|
+
exports.encodeKaladaValue = encodeKaladaValue;
|
|
148
|
+
//# sourceMappingURL=codec.cjs.map
|
|
149
|
+
//# sourceMappingURL=codec.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/codec.ts"],"names":["DEFAULT_KALADA_V1_LIMITS","isOption","isResult","cloneJsonWithStats","dataValue","Option","cloneJson","Result"],"mappings":"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","file":"codec.cjs","sourcesContent":["import { cloneJson, cloneJsonWithStats, dataValue, type JsonValue } from \"./json.js\";\nimport { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\nimport { isOption, isResult, type KaladaValue, Option, Result } from \"./values.js\";\n\ninterface EncodedHeader {\n readonly format: \"kalada-value\";\n readonly version: 1;\n}\n\nexport type EncodedKaladaValueV1 =\n | (EncodedHeader & {\n readonly type: \"Json\";\n readonly variant: \"value\";\n readonly value: JsonValue;\n })\n | (EncodedHeader & { readonly type: \"Option\"; readonly variant: \"none\" })\n | (EncodedHeader & {\n readonly type: \"Option\";\n readonly variant: \"some\";\n readonly value: EncodedKaladaValueV1;\n })\n | (EncodedHeader & {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n readonly value: EncodedKaladaValueV1;\n });\n\ntype Frame =\n | { readonly type: \"Option\"; readonly variant: \"some\" }\n | {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n };\n\nconst INVALID = \"Invalid kalada-value v1 envelope.\";\nconst LIMITS = Object.freeze({\n maxDepth: DEFAULT_KALADA_V1_LIMITS.maxValueDepth,\n maxNodes: DEFAULT_KALADA_V1_LIMITS.maxValueNodes,\n maxStringLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength,\n});\n\nexport function encodeKaladaValue(value: KaladaValue): EncodedKaladaValueV1 {\n const frames: Frame[] = [];\n const seen = new WeakSet<object>();\n let current = value;\n let nodes = 0;\n while (isOption(current) || isResult(current)) {\n nodes = charge(nodes, frames.length);\n if (seen.has(current)) throw new TypeError(INVALID);\n seen.add(current);\n if (isOption(current) && current.variant === \"none\") {\n return wrapFrames(frozenNone(), frames);\n }\n frames.push({ type: current.type, variant: current.variant } as Frame);\n current = current.value;\n }\n const remaining = LIMITS.maxNodes - charge(nodes, frames.length);\n const json = cloneJsonWithStats(current, {\n ...LIMITS,\n maxDepth: remainingDepth(frames.length),\n maxNodes: remaining,\n });\n return wrapFrames(frozenJson(json.value), frames);\n}\n\nexport function decodeKaladaValue(input: unknown): KaladaValue {\n const frames: Frame[] = [];\n const active = new WeakSet<object>();\n let current = input;\n let nodes = 0;\n while (true) {\n nodes = charge(nodes, frames.length);\n const envelope = envelopeObject(current);\n if (active.has(envelope)) throw new TypeError(INVALID);\n active.add(envelope);\n const fields = envelopeFields(envelope);\n if (fields.type === \"Json\" && fields.variant === \"value\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n const value = decodeJson(dataValue(envelope, \"value\"), nodes, frames.length);\n return wrapValues(value, frames);\n }\n if (fields.type === \"Option\" && fields.variant === \"none\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\"]);\n return wrapValues(Option.none(), frames);\n }\n frames.push(payloadFrame(fields.type, fields.variant));\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n current = dataValue(envelope, \"value\");\n }\n}\n\nfunction decodeJson(input: unknown, nodes: number, depth: number): JsonValue {\n return cloneJson(input, {\n ...LIMITS,\n maxDepth: remainingDepth(depth),\n maxNodes: LIMITS.maxNodes - nodes,\n });\n}\n\nfunction envelopeObject(input: unknown): object {\n if (typeof input !== \"object\" || input === null || Array.isArray(input))\n throw new TypeError(INVALID);\n try {\n const prototype = Object.getPrototypeOf(input);\n if (prototype !== Object.prototype && prototype !== null) throw new TypeError(INVALID);\n return input;\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction envelopeFields(input: object): { type: unknown; variant: unknown } {\n try {\n if (dataValue(input, \"format\") !== \"kalada-value\" || dataValue(input, \"version\") !== 1) {\n throw new TypeError(INVALID);\n }\n return { type: dataValue(input, \"type\"), variant: dataValue(input, \"variant\") };\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction payloadFrame(type: unknown, variant: unknown): Frame {\n if (type === \"Option\" && variant === \"some\") return { type, variant };\n if (type === \"Result\" && (variant === \"ok\" || variant === \"err\")) return { type, variant };\n throw new TypeError(INVALID);\n}\n\nfunction assertKeys(input: object, expected: readonly string[]): void {\n let keys: PropertyKey[];\n try {\n keys = Reflect.ownKeys(input);\n } catch {\n throw new TypeError(INVALID);\n }\n if (\n keys.length !== expected.length ||\n !keys.every((key) => typeof key === \"string\" && expected.includes(key))\n ) {\n throw new TypeError(INVALID);\n }\n}\n\nfunction wrapFrames(leaf: EncodedKaladaValueV1, frames: readonly Frame[]): EncodedKaladaValueV1 {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output = Object.freeze({ format: \"kalada-value\", version: 1, ...frame, value: output });\n }\n return output;\n}\n\nfunction wrapValues(leaf: KaladaValue, frames: readonly Frame[]): KaladaValue {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output =\n frame.type === \"Option\"\n ? Option.some(output)\n : frame.variant === \"ok\"\n ? Result.ok(output)\n : Result.err(output);\n }\n return output;\n}\n\nfunction charge(nodes: number, depth: number): number {\n if (depth > LIMITS.maxDepth || nodes >= LIMITS.maxNodes)\n throw new RangeError(\"Kalada value exceeds its limits.\");\n return nodes + 1;\n}\n\nfunction remainingDepth(depth: number): number {\n const remaining = LIMITS.maxDepth - depth;\n if (remaining < 0) throw new RangeError(\"Kalada value exceeds its limits.\");\n return remaining;\n}\n\nfunction frozenNone(): EncodedKaladaValueV1 {\n return Object.freeze({ format: \"kalada-value\", version: 1, type: \"Option\", variant: \"none\" });\n}\n\nfunction frozenJson(value: JsonValue): EncodedKaladaValueV1 {\n return Object.freeze({\n format: \"kalada-value\",\n version: 1,\n type: \"Json\",\n variant: \"value\",\n value,\n });\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { JsonValue } from './json.cjs';
|
|
2
|
+
import { KaladaValue } from './values.cjs';
|
|
3
|
+
|
|
4
|
+
interface EncodedHeader {
|
|
5
|
+
readonly format: "kalada-value";
|
|
6
|
+
readonly version: 1;
|
|
7
|
+
}
|
|
8
|
+
type EncodedKaladaValueV1 = (EncodedHeader & {
|
|
9
|
+
readonly type: "Json";
|
|
10
|
+
readonly variant: "value";
|
|
11
|
+
readonly value: JsonValue;
|
|
12
|
+
}) | (EncodedHeader & {
|
|
13
|
+
readonly type: "Option";
|
|
14
|
+
readonly variant: "none";
|
|
15
|
+
}) | (EncodedHeader & {
|
|
16
|
+
readonly type: "Option";
|
|
17
|
+
readonly variant: "some";
|
|
18
|
+
readonly value: EncodedKaladaValueV1;
|
|
19
|
+
}) | (EncodedHeader & {
|
|
20
|
+
readonly type: "Result";
|
|
21
|
+
readonly variant: "ok" | "err";
|
|
22
|
+
readonly value: EncodedKaladaValueV1;
|
|
23
|
+
});
|
|
24
|
+
declare function encodeKaladaValue(value: KaladaValue): EncodedKaladaValueV1;
|
|
25
|
+
declare function decodeKaladaValue(input: unknown): KaladaValue;
|
|
26
|
+
|
|
27
|
+
export { type EncodedKaladaValueV1, decodeKaladaValue, encodeKaladaValue };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { JsonValue } from './json.js';
|
|
2
|
+
import { KaladaValue } from './values.js';
|
|
3
|
+
|
|
4
|
+
interface EncodedHeader {
|
|
5
|
+
readonly format: "kalada-value";
|
|
6
|
+
readonly version: 1;
|
|
7
|
+
}
|
|
8
|
+
type EncodedKaladaValueV1 = (EncodedHeader & {
|
|
9
|
+
readonly type: "Json";
|
|
10
|
+
readonly variant: "value";
|
|
11
|
+
readonly value: JsonValue;
|
|
12
|
+
}) | (EncodedHeader & {
|
|
13
|
+
readonly type: "Option";
|
|
14
|
+
readonly variant: "none";
|
|
15
|
+
}) | (EncodedHeader & {
|
|
16
|
+
readonly type: "Option";
|
|
17
|
+
readonly variant: "some";
|
|
18
|
+
readonly value: EncodedKaladaValueV1;
|
|
19
|
+
}) | (EncodedHeader & {
|
|
20
|
+
readonly type: "Result";
|
|
21
|
+
readonly variant: "ok" | "err";
|
|
22
|
+
readonly value: EncodedKaladaValueV1;
|
|
23
|
+
});
|
|
24
|
+
declare function encodeKaladaValue(value: KaladaValue): EncodedKaladaValueV1;
|
|
25
|
+
declare function decodeKaladaValue(input: unknown): KaladaValue;
|
|
26
|
+
|
|
27
|
+
export { type EncodedKaladaValueV1, decodeKaladaValue, encodeKaladaValue };
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { cloneJsonWithStats, dataValue, cloneJson } from './json.js';
|
|
2
|
+
import { DEFAULT_KALADA_V1_LIMITS } from './limits.js';
|
|
3
|
+
import { isOption, isResult, Option, Result } from './values.js';
|
|
4
|
+
|
|
5
|
+
const INVALID = "Invalid kalada-value v1 envelope.";
|
|
6
|
+
const LIMITS = Object.freeze({
|
|
7
|
+
maxDepth: DEFAULT_KALADA_V1_LIMITS.maxValueDepth,
|
|
8
|
+
maxNodes: DEFAULT_KALADA_V1_LIMITS.maxValueNodes,
|
|
9
|
+
maxStringLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength
|
|
10
|
+
});
|
|
11
|
+
function encodeKaladaValue(value) {
|
|
12
|
+
const frames = [];
|
|
13
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
14
|
+
let current = value;
|
|
15
|
+
let nodes = 0;
|
|
16
|
+
while (isOption(current) || isResult(current)) {
|
|
17
|
+
nodes = charge(nodes, frames.length);
|
|
18
|
+
if (seen.has(current)) throw new TypeError(INVALID);
|
|
19
|
+
seen.add(current);
|
|
20
|
+
if (isOption(current) && current.variant === "none") {
|
|
21
|
+
return wrapFrames(frozenNone(), frames);
|
|
22
|
+
}
|
|
23
|
+
frames.push({ type: current.type, variant: current.variant });
|
|
24
|
+
current = current.value;
|
|
25
|
+
}
|
|
26
|
+
const remaining = LIMITS.maxNodes - charge(nodes, frames.length);
|
|
27
|
+
const json = cloneJsonWithStats(current, {
|
|
28
|
+
...LIMITS,
|
|
29
|
+
maxDepth: remainingDepth(frames.length),
|
|
30
|
+
maxNodes: remaining
|
|
31
|
+
});
|
|
32
|
+
return wrapFrames(frozenJson(json.value), frames);
|
|
33
|
+
}
|
|
34
|
+
function decodeKaladaValue(input) {
|
|
35
|
+
const frames = [];
|
|
36
|
+
const active = /* @__PURE__ */ new WeakSet();
|
|
37
|
+
let current = input;
|
|
38
|
+
let nodes = 0;
|
|
39
|
+
while (true) {
|
|
40
|
+
nodes = charge(nodes, frames.length);
|
|
41
|
+
const envelope = envelopeObject(current);
|
|
42
|
+
if (active.has(envelope)) throw new TypeError(INVALID);
|
|
43
|
+
active.add(envelope);
|
|
44
|
+
const fields = envelopeFields(envelope);
|
|
45
|
+
if (fields.type === "Json" && fields.variant === "value") {
|
|
46
|
+
assertKeys(envelope, ["format", "version", "type", "variant", "value"]);
|
|
47
|
+
const value = decodeJson(dataValue(envelope, "value"), nodes, frames.length);
|
|
48
|
+
return wrapValues(value, frames);
|
|
49
|
+
}
|
|
50
|
+
if (fields.type === "Option" && fields.variant === "none") {
|
|
51
|
+
assertKeys(envelope, ["format", "version", "type", "variant"]);
|
|
52
|
+
return wrapValues(Option.none(), frames);
|
|
53
|
+
}
|
|
54
|
+
frames.push(payloadFrame(fields.type, fields.variant));
|
|
55
|
+
assertKeys(envelope, ["format", "version", "type", "variant", "value"]);
|
|
56
|
+
current = dataValue(envelope, "value");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function decodeJson(input, nodes, depth) {
|
|
60
|
+
return cloneJson(input, {
|
|
61
|
+
...LIMITS,
|
|
62
|
+
maxDepth: remainingDepth(depth),
|
|
63
|
+
maxNodes: LIMITS.maxNodes - nodes
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function envelopeObject(input) {
|
|
67
|
+
if (typeof input !== "object" || input === null || Array.isArray(input))
|
|
68
|
+
throw new TypeError(INVALID);
|
|
69
|
+
try {
|
|
70
|
+
const prototype = Object.getPrototypeOf(input);
|
|
71
|
+
if (prototype !== Object.prototype && prototype !== null) throw new TypeError(INVALID);
|
|
72
|
+
return input;
|
|
73
|
+
} catch {
|
|
74
|
+
throw new TypeError(INVALID);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function envelopeFields(input) {
|
|
78
|
+
try {
|
|
79
|
+
if (dataValue(input, "format") !== "kalada-value" || dataValue(input, "version") !== 1) {
|
|
80
|
+
throw new TypeError(INVALID);
|
|
81
|
+
}
|
|
82
|
+
return { type: dataValue(input, "type"), variant: dataValue(input, "variant") };
|
|
83
|
+
} catch {
|
|
84
|
+
throw new TypeError(INVALID);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function payloadFrame(type, variant) {
|
|
88
|
+
if (type === "Option" && variant === "some") return { type, variant };
|
|
89
|
+
if (type === "Result" && (variant === "ok" || variant === "err")) return { type, variant };
|
|
90
|
+
throw new TypeError(INVALID);
|
|
91
|
+
}
|
|
92
|
+
function assertKeys(input, expected) {
|
|
93
|
+
let keys;
|
|
94
|
+
try {
|
|
95
|
+
keys = Reflect.ownKeys(input);
|
|
96
|
+
} catch {
|
|
97
|
+
throw new TypeError(INVALID);
|
|
98
|
+
}
|
|
99
|
+
if (keys.length !== expected.length || !keys.every((key) => typeof key === "string" && expected.includes(key))) {
|
|
100
|
+
throw new TypeError(INVALID);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function wrapFrames(leaf, frames) {
|
|
104
|
+
let output = leaf;
|
|
105
|
+
for (let index = frames.length - 1; index >= 0; index -= 1) {
|
|
106
|
+
const frame = frames[index];
|
|
107
|
+
if (!frame) throw new TypeError(INVALID);
|
|
108
|
+
output = Object.freeze({ format: "kalada-value", version: 1, ...frame, value: output });
|
|
109
|
+
}
|
|
110
|
+
return output;
|
|
111
|
+
}
|
|
112
|
+
function wrapValues(leaf, frames) {
|
|
113
|
+
let output = leaf;
|
|
114
|
+
for (let index = frames.length - 1; index >= 0; index -= 1) {
|
|
115
|
+
const frame = frames[index];
|
|
116
|
+
if (!frame) throw new TypeError(INVALID);
|
|
117
|
+
output = frame.type === "Option" ? Option.some(output) : frame.variant === "ok" ? Result.ok(output) : Result.err(output);
|
|
118
|
+
}
|
|
119
|
+
return output;
|
|
120
|
+
}
|
|
121
|
+
function charge(nodes, depth) {
|
|
122
|
+
if (depth > LIMITS.maxDepth || nodes >= LIMITS.maxNodes)
|
|
123
|
+
throw new RangeError("Kalada value exceeds its limits.");
|
|
124
|
+
return nodes + 1;
|
|
125
|
+
}
|
|
126
|
+
function remainingDepth(depth) {
|
|
127
|
+
const remaining = LIMITS.maxDepth - depth;
|
|
128
|
+
if (remaining < 0) throw new RangeError("Kalada value exceeds its limits.");
|
|
129
|
+
return remaining;
|
|
130
|
+
}
|
|
131
|
+
function frozenNone() {
|
|
132
|
+
return Object.freeze({ format: "kalada-value", version: 1, type: "Option", variant: "none" });
|
|
133
|
+
}
|
|
134
|
+
function frozenJson(value) {
|
|
135
|
+
return Object.freeze({
|
|
136
|
+
format: "kalada-value",
|
|
137
|
+
version: 1,
|
|
138
|
+
type: "Json",
|
|
139
|
+
variant: "value",
|
|
140
|
+
value
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export { decodeKaladaValue, encodeKaladaValue };
|
|
145
|
+
//# sourceMappingURL=codec.js.map
|
|
146
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/codec.ts"],"names":[],"mappings":"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","file":"codec.js","sourcesContent":["import { cloneJson, cloneJsonWithStats, dataValue, type JsonValue } from \"./json.js\";\nimport { DEFAULT_KALADA_V1_LIMITS } from \"./limits.js\";\nimport { isOption, isResult, type KaladaValue, Option, Result } from \"./values.js\";\n\ninterface EncodedHeader {\n readonly format: \"kalada-value\";\n readonly version: 1;\n}\n\nexport type EncodedKaladaValueV1 =\n | (EncodedHeader & {\n readonly type: \"Json\";\n readonly variant: \"value\";\n readonly value: JsonValue;\n })\n | (EncodedHeader & { readonly type: \"Option\"; readonly variant: \"none\" })\n | (EncodedHeader & {\n readonly type: \"Option\";\n readonly variant: \"some\";\n readonly value: EncodedKaladaValueV1;\n })\n | (EncodedHeader & {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n readonly value: EncodedKaladaValueV1;\n });\n\ntype Frame =\n | { readonly type: \"Option\"; readonly variant: \"some\" }\n | {\n readonly type: \"Result\";\n readonly variant: \"ok\" | \"err\";\n };\n\nconst INVALID = \"Invalid kalada-value v1 envelope.\";\nconst LIMITS = Object.freeze({\n maxDepth: DEFAULT_KALADA_V1_LIMITS.maxValueDepth,\n maxNodes: DEFAULT_KALADA_V1_LIMITS.maxValueNodes,\n maxStringLength: DEFAULT_KALADA_V1_LIMITS.maxStringLength,\n});\n\nexport function encodeKaladaValue(value: KaladaValue): EncodedKaladaValueV1 {\n const frames: Frame[] = [];\n const seen = new WeakSet<object>();\n let current = value;\n let nodes = 0;\n while (isOption(current) || isResult(current)) {\n nodes = charge(nodes, frames.length);\n if (seen.has(current)) throw new TypeError(INVALID);\n seen.add(current);\n if (isOption(current) && current.variant === \"none\") {\n return wrapFrames(frozenNone(), frames);\n }\n frames.push({ type: current.type, variant: current.variant } as Frame);\n current = current.value;\n }\n const remaining = LIMITS.maxNodes - charge(nodes, frames.length);\n const json = cloneJsonWithStats(current, {\n ...LIMITS,\n maxDepth: remainingDepth(frames.length),\n maxNodes: remaining,\n });\n return wrapFrames(frozenJson(json.value), frames);\n}\n\nexport function decodeKaladaValue(input: unknown): KaladaValue {\n const frames: Frame[] = [];\n const active = new WeakSet<object>();\n let current = input;\n let nodes = 0;\n while (true) {\n nodes = charge(nodes, frames.length);\n const envelope = envelopeObject(current);\n if (active.has(envelope)) throw new TypeError(INVALID);\n active.add(envelope);\n const fields = envelopeFields(envelope);\n if (fields.type === \"Json\" && fields.variant === \"value\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n const value = decodeJson(dataValue(envelope, \"value\"), nodes, frames.length);\n return wrapValues(value, frames);\n }\n if (fields.type === \"Option\" && fields.variant === \"none\") {\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\"]);\n return wrapValues(Option.none(), frames);\n }\n frames.push(payloadFrame(fields.type, fields.variant));\n assertKeys(envelope, [\"format\", \"version\", \"type\", \"variant\", \"value\"]);\n current = dataValue(envelope, \"value\");\n }\n}\n\nfunction decodeJson(input: unknown, nodes: number, depth: number): JsonValue {\n return cloneJson(input, {\n ...LIMITS,\n maxDepth: remainingDepth(depth),\n maxNodes: LIMITS.maxNodes - nodes,\n });\n}\n\nfunction envelopeObject(input: unknown): object {\n if (typeof input !== \"object\" || input === null || Array.isArray(input))\n throw new TypeError(INVALID);\n try {\n const prototype = Object.getPrototypeOf(input);\n if (prototype !== Object.prototype && prototype !== null) throw new TypeError(INVALID);\n return input;\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction envelopeFields(input: object): { type: unknown; variant: unknown } {\n try {\n if (dataValue(input, \"format\") !== \"kalada-value\" || dataValue(input, \"version\") !== 1) {\n throw new TypeError(INVALID);\n }\n return { type: dataValue(input, \"type\"), variant: dataValue(input, \"variant\") };\n } catch {\n throw new TypeError(INVALID);\n }\n}\n\nfunction payloadFrame(type: unknown, variant: unknown): Frame {\n if (type === \"Option\" && variant === \"some\") return { type, variant };\n if (type === \"Result\" && (variant === \"ok\" || variant === \"err\")) return { type, variant };\n throw new TypeError(INVALID);\n}\n\nfunction assertKeys(input: object, expected: readonly string[]): void {\n let keys: PropertyKey[];\n try {\n keys = Reflect.ownKeys(input);\n } catch {\n throw new TypeError(INVALID);\n }\n if (\n keys.length !== expected.length ||\n !keys.every((key) => typeof key === \"string\" && expected.includes(key))\n ) {\n throw new TypeError(INVALID);\n }\n}\n\nfunction wrapFrames(leaf: EncodedKaladaValueV1, frames: readonly Frame[]): EncodedKaladaValueV1 {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output = Object.freeze({ format: \"kalada-value\", version: 1, ...frame, value: output });\n }\n return output;\n}\n\nfunction wrapValues(leaf: KaladaValue, frames: readonly Frame[]): KaladaValue {\n let output = leaf;\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = frames[index];\n if (!frame) throw new TypeError(INVALID);\n output =\n frame.type === \"Option\"\n ? Option.some(output)\n : frame.variant === \"ok\"\n ? Result.ok(output)\n : Result.err(output);\n }\n return output;\n}\n\nfunction charge(nodes: number, depth: number): number {\n if (depth > LIMITS.maxDepth || nodes >= LIMITS.maxNodes)\n throw new RangeError(\"Kalada value exceeds its limits.\");\n return nodes + 1;\n}\n\nfunction remainingDepth(depth: number): number {\n const remaining = LIMITS.maxDepth - depth;\n if (remaining < 0) throw new RangeError(\"Kalada value exceeds its limits.\");\n return remaining;\n}\n\nfunction frozenNone(): EncodedKaladaValueV1 {\n return Object.freeze({ format: \"kalada-value\", version: 1, type: \"Option\", variant: \"none\" });\n}\n\nfunction frozenJson(value: JsonValue): EncodedKaladaValueV1 {\n return Object.freeze({\n format: \"kalada-value\",\n version: 1,\n type: \"Json\",\n variant: \"value\",\n value,\n });\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var canonicalize_js = require('./canonicalize.js');
|
|
4
|
+
var dependencies_js = require('./dependencies.js');
|
|
5
|
+
var diagnostics_js = require('./diagnostics.js');
|
|
6
|
+
var evaluate_js = require('./evaluate.js');
|
|
7
|
+
var limits_js = require('./limits.js');
|
|
8
|
+
|
|
9
|
+
function compileKaladaV1Program(input, options = {}) {
|
|
10
|
+
const canonical = canonicalize_js.canonicalizeKaladaV1Program(input, options);
|
|
11
|
+
if (!canonical.ok) return canonical;
|
|
12
|
+
let limits;
|
|
13
|
+
try {
|
|
14
|
+
limits = limits_js.resolveLimits(options.limits);
|
|
15
|
+
} catch {
|
|
16
|
+
return diagnostics_js.failure("KALADA_LIMIT_EXCEEDED", []);
|
|
17
|
+
}
|
|
18
|
+
const program = canonical.value;
|
|
19
|
+
const dependencies = dependencies_js.collectKaladaV1Dependencies(program.expression);
|
|
20
|
+
return diagnostics_js.success(
|
|
21
|
+
Object.freeze({
|
|
22
|
+
program,
|
|
23
|
+
dependencies,
|
|
24
|
+
evaluate: (resolve) => evaluate_js.evaluateKaladaV1(program.expression, resolve, limits)
|
|
25
|
+
})
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
exports.compileKaladaV1Program = compileKaladaV1Program;
|
|
30
|
+
//# sourceMappingURL=compile.cjs.map
|
|
31
|
+
//# sourceMappingURL=compile.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/compile.ts"],"names":["canonicalizeKaladaV1Program","resolveLimits","failure","collectKaladaV1Dependencies","success","evaluateKaladaV1"],"mappings":";;;;;;;;AAcO,SAAS,sBAAA,CACd,KAAA,EACA,OAAA,GAA8B,EAAC,EACc;AAC7C,EAAA,MAAM,SAAA,GAAYA,2CAAA,CAA+B,KAAA,EAAO,OAAO,CAAA;AAC/D,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA;AAC1B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAASC,uBAAA,CAAc,QAAQ,MAAM,CAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAOC,sBAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA;AAAA,EAC5C;AACA,EAAA,MAAM,UAAU,SAAA,CAAU,KAAA;AAC1B,EAAA,MAAM,YAAA,GAAeC,2CAAA,CAA4B,OAAA,CAAQ,UAAU,CAAA;AACnE,EAAA,OAAOC,sBAAA;AAAA,IACL,OAAO,MAAA,CAAO;AAAA,MACZ,OAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAU,CAAC,OAAA,KACTC,6BAAiB,OAAA,CAAQ,UAAA,EAAY,SAAS,MAAM;AAAA,KACvD;AAAA,GACH;AACF","file":"compile.cjs","sourcesContent":["import { canonicalizeKaladaV1Program } from \"./canonicalize.js\";\nimport { collectKaladaV1Dependencies } from \"./dependencies.js\";\nimport { failure, success } from \"./diagnostics.js\";\nimport { evaluateKaladaV1 } from \"./evaluate.js\";\nimport type { JsonValue } from \"./json.js\";\nimport { resolveLimits } from \"./limits.js\";\nimport type {\n CompiledKaladaV1Program,\n KaladaV1Limits,\n KaladaV1Options,\n KaladaV1Outcome,\n KaladaV1Resolver,\n} from \"./types.js\";\n\nexport function compileKaladaV1Program<R extends JsonValue = string>(\n input: unknown,\n options: KaladaV1Options<R> = {},\n): KaladaV1Outcome<CompiledKaladaV1Program<R>> {\n const canonical = canonicalizeKaladaV1Program<R>(input, options);\n if (!canonical.ok) return canonical;\n let limits: KaladaV1Limits;\n try {\n limits = resolveLimits(options.limits);\n } catch {\n return failure(\"KALADA_LIMIT_EXCEEDED\", []);\n }\n const program = canonical.value;\n const dependencies = collectKaladaV1Dependencies(program.expression);\n return success(\n Object.freeze({\n program,\n dependencies,\n evaluate: (resolve: KaladaV1Resolver<R>) =>\n evaluateKaladaV1(program.expression, resolve, limits),\n }),\n );\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { JsonValue } from './json.cjs';
|
|
2
|
+
import { KaladaV1Options, KaladaV1Outcome, CompiledKaladaV1Program } from './types.cjs';
|
|
3
|
+
import './values.cjs';
|
|
4
|
+
|
|
5
|
+
declare function compileKaladaV1Program<R extends JsonValue = string>(input: unknown, options?: KaladaV1Options<R>): KaladaV1Outcome<CompiledKaladaV1Program<R>>;
|
|
6
|
+
|
|
7
|
+
export { compileKaladaV1Program };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { JsonValue } from './json.js';
|
|
2
|
+
import { KaladaV1Options, KaladaV1Outcome, CompiledKaladaV1Program } from './types.js';
|
|
3
|
+
import './values.js';
|
|
4
|
+
|
|
5
|
+
declare function compileKaladaV1Program<R extends JsonValue = string>(input: unknown, options?: KaladaV1Options<R>): KaladaV1Outcome<CompiledKaladaV1Program<R>>;
|
|
6
|
+
|
|
7
|
+
export { compileKaladaV1Program };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { canonicalizeKaladaV1Program } from './canonicalize.js';
|
|
2
|
+
import { collectKaladaV1Dependencies } from './dependencies.js';
|
|
3
|
+
import { failure, success } from './diagnostics.js';
|
|
4
|
+
import { evaluateKaladaV1 } from './evaluate.js';
|
|
5
|
+
import { resolveLimits } from './limits.js';
|
|
6
|
+
|
|
7
|
+
function compileKaladaV1Program(input, options = {}) {
|
|
8
|
+
const canonical = canonicalizeKaladaV1Program(input, options);
|
|
9
|
+
if (!canonical.ok) return canonical;
|
|
10
|
+
let limits;
|
|
11
|
+
try {
|
|
12
|
+
limits = resolveLimits(options.limits);
|
|
13
|
+
} catch {
|
|
14
|
+
return failure("KALADA_LIMIT_EXCEEDED", []);
|
|
15
|
+
}
|
|
16
|
+
const program = canonical.value;
|
|
17
|
+
const dependencies = collectKaladaV1Dependencies(program.expression);
|
|
18
|
+
return success(
|
|
19
|
+
Object.freeze({
|
|
20
|
+
program,
|
|
21
|
+
dependencies,
|
|
22
|
+
evaluate: (resolve) => evaluateKaladaV1(program.expression, resolve, limits)
|
|
23
|
+
})
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { compileKaladaV1Program };
|
|
28
|
+
//# sourceMappingURL=compile.js.map
|
|
29
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/compile.ts"],"names":[],"mappings":";;;;;;AAcO,SAAS,sBAAA,CACd,KAAA,EACA,OAAA,GAA8B,EAAC,EACc;AAC7C,EAAA,MAAM,SAAA,GAAY,2BAAA,CAA+B,KAAA,EAAO,OAAO,CAAA;AAC/D,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA;AAC1B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,aAAA,CAAc,QAAQ,MAAM,CAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA;AAAA,EAC5C;AACA,EAAA,MAAM,UAAU,SAAA,CAAU,KAAA;AAC1B,EAAA,MAAM,YAAA,GAAe,2BAAA,CAA4B,OAAA,CAAQ,UAAU,CAAA;AACnE,EAAA,OAAO,OAAA;AAAA,IACL,OAAO,MAAA,CAAO;AAAA,MACZ,OAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAU,CAAC,OAAA,KACT,iBAAiB,OAAA,CAAQ,UAAA,EAAY,SAAS,MAAM;AAAA,KACvD;AAAA,GACH;AACF","file":"compile.js","sourcesContent":["import { canonicalizeKaladaV1Program } from \"./canonicalize.js\";\nimport { collectKaladaV1Dependencies } from \"./dependencies.js\";\nimport { failure, success } from \"./diagnostics.js\";\nimport { evaluateKaladaV1 } from \"./evaluate.js\";\nimport type { JsonValue } from \"./json.js\";\nimport { resolveLimits } from \"./limits.js\";\nimport type {\n CompiledKaladaV1Program,\n KaladaV1Limits,\n KaladaV1Options,\n KaladaV1Outcome,\n KaladaV1Resolver,\n} from \"./types.js\";\n\nexport function compileKaladaV1Program<R extends JsonValue = string>(\n input: unknown,\n options: KaladaV1Options<R> = {},\n): KaladaV1Outcome<CompiledKaladaV1Program<R>> {\n const canonical = canonicalizeKaladaV1Program<R>(input, options);\n if (!canonical.ok) return canonical;\n let limits: KaladaV1Limits;\n try {\n limits = resolveLimits(options.limits);\n } catch {\n return failure(\"KALADA_LIMIT_EXCEEDED\", []);\n }\n const program = canonical.value;\n const dependencies = collectKaladaV1Dependencies(program.expression);\n return success(\n Object.freeze({\n program,\n dependencies,\n evaluate: (resolve: KaladaV1Resolver<R>) =>\n evaluateKaladaV1(program.expression, resolve, limits),\n }),\n );\n}\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var json_js = require('./json.js');
|
|
4
|
+
|
|
5
|
+
function collectKaladaV1Dependencies(expression) {
|
|
6
|
+
const output = [];
|
|
7
|
+
const identities = /* @__PURE__ */ new Set();
|
|
8
|
+
visit(expression, /* @__PURE__ */ new Set(), output, identities);
|
|
9
|
+
return Object.freeze(output);
|
|
10
|
+
}
|
|
11
|
+
function visit(node, scope, output, identities) {
|
|
12
|
+
if (node.kind === "ref") {
|
|
13
|
+
addReference(node.ref, scope, output, identities);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (node.kind === "literal" || node.kind === "option" && node.variant === "none") return;
|
|
17
|
+
if (node.kind === "binding") {
|
|
18
|
+
visitBinding(node, scope, output, identities);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (node.kind === "match") {
|
|
22
|
+
visitMatch(node.value, node.arms, scope, output, identities);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
visit(node.value, scope, output, identities);
|
|
26
|
+
}
|
|
27
|
+
function visitBinding(node, scope, output, identities) {
|
|
28
|
+
visit(node.value, scope, output, identities);
|
|
29
|
+
visit(node.body, extended(scope, node.name), output, identities);
|
|
30
|
+
}
|
|
31
|
+
function visitMatch(value, arms, scope, output, identities) {
|
|
32
|
+
visit(value, scope, output, identities);
|
|
33
|
+
for (const arm of arms) {
|
|
34
|
+
visit(arm.body, arm.binding ? extended(scope, arm.binding) : scope, output, identities);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function addReference(reference, scope, output, identities) {
|
|
38
|
+
if (typeof reference === "string" && scope.has(reference)) return;
|
|
39
|
+
const identity = json_js.canonicalJsonIdentity(reference);
|
|
40
|
+
if (identities.has(identity)) return;
|
|
41
|
+
identities.add(identity);
|
|
42
|
+
output.push(reference);
|
|
43
|
+
}
|
|
44
|
+
function extended(scope, name) {
|
|
45
|
+
const output = new Set(scope);
|
|
46
|
+
output.add(name);
|
|
47
|
+
return output;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
exports.collectKaladaV1Dependencies = collectKaladaV1Dependencies;
|
|
51
|
+
//# sourceMappingURL=dependencies.cjs.map
|
|
52
|
+
//# sourceMappingURL=dependencies.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/dependencies.ts"],"names":["canonicalJsonIdentity"],"mappings":";;;;AAGO,SAAS,4BACd,UAAA,EACc;AACd,EAAA,MAAM,SAAc,EAAC;AACrB,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,CAAM,UAAA,kBAAY,IAAI,GAAA,EAAI,EAAG,QAAQ,UAAU,CAAA;AAC/C,EAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAC7B;AAEA,SAAS,KAAA,CACP,IAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,IAAA,YAAA,CAAa,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAChD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,IAAc,IAAA,CAAK,SAAS,QAAA,IAAY,IAAA,CAAK,YAAY,MAAA,EAAS;AACpF,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,IAAA,YAAA,CAAa,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC5C,IAAA;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,UAAA,CAAW,KAAK,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,QAAQ,UAAU,CAAA;AAC3D,IAAA;AAAA,EACF;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC7C;AAEA,SAAS,YAAA,CACP,IAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAC3C,EAAA,KAAA,CAAM,IAAA,CAAK,MAAM,QAAA,CAAS,KAAA,EAAO,KAAK,IAAI,CAAA,EAAG,QAAQ,UAAU,CAAA;AACjE;AAEA,SAAS,UAAA,CACP,KAAA,EACA,IAAA,EACA,KAAA,EACA,QACA,UAAA,EACM;AACN,EAAA,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AACtC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,CAAM,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAA,GAAU,QAAA,CAAS,KAAA,EAAO,GAAA,CAAI,OAAO,CAAA,GAAI,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAAA,EACxF;AACF;AAEA,SAAS,YAAA,CACP,SAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACM;AACN,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3D,EAAA,MAAM,QAAA,GAAWA,8BAAsB,SAAS,CAAA;AAChD,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,EAAA,UAAA,CAAW,IAAI,QAAQ,CAAA;AACvB,EAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACvB;AAEA,SAAS,QAAA,CAAS,OAA4B,IAAA,EAAmC;AAC/E,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,KAAK,CAAA;AAC5B,EAAA,MAAA,CAAO,IAAI,IAAI,CAAA;AACf,EAAA,OAAO,MAAA;AACT","file":"dependencies.cjs","sourcesContent":["import { canonicalJsonIdentity, type JsonValue } from \"./json.js\";\nimport type { KaladaV1Expression, MatchArm } from \"./types.js\";\n\nexport function collectKaladaV1Dependencies<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n): readonly R[] {\n const output: R[] = [];\n const identities = new Set<string>();\n visit(expression, new Set(), output, identities);\n return Object.freeze(output);\n}\n\nfunction visit<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (node.kind === \"ref\") {\n addReference(node.ref, scope, output, identities);\n return;\n }\n if (node.kind === \"literal\" || (node.kind === \"option\" && node.variant === \"none\")) return;\n if (node.kind === \"binding\") {\n visitBinding(node, scope, output, identities);\n return;\n }\n if (node.kind === \"match\") {\n visitMatch(node.value, node.arms, scope, output, identities);\n return;\n }\n visit(node.value, scope, output, identities);\n}\n\nfunction visitBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(node.value, scope, output, identities);\n visit(node.body, extended(scope, node.name), output, identities);\n}\n\nfunction visitMatch<R extends JsonValue>(\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n visit(value, scope, output, identities);\n for (const arm of arms) {\n visit(arm.body, arm.binding ? extended(scope, arm.binding) : scope, output, identities);\n }\n}\n\nfunction addReference<R extends JsonValue>(\n reference: R,\n scope: ReadonlySet<string>,\n output: R[],\n identities: Set<string>,\n): void {\n if (typeof reference === \"string\" && scope.has(reference)) return;\n const identity = canonicalJsonIdentity(reference);\n if (identities.has(identity)) return;\n identities.add(identity);\n output.push(reference);\n}\n\nfunction extended(scope: ReadonlySet<string>, name: string): ReadonlySet<string> {\n const output = new Set(scope);\n output.add(name);\n return output;\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { JsonValue } from './json.cjs';
|
|
2
|
+
import { KaladaV1Expression } from './types.cjs';
|
|
3
|
+
import './values.cjs';
|
|
4
|
+
|
|
5
|
+
declare function collectKaladaV1Dependencies<R extends JsonValue>(expression: KaladaV1Expression<R>): readonly R[];
|
|
6
|
+
|
|
7
|
+
export { collectKaladaV1Dependencies };
|