in packages/jinja/src/runtime.ts [1494:1525]
function convertToRuntimeValues(input: unknown): AnyRuntimeValue {
switch (typeof input) {
case "number":
return Number.isInteger(input) ? new IntegerValue(input) : new FloatValue(input);
case "string":
return new StringValue(input);
case "boolean":
return new BooleanValue(input);
case "undefined":
return new UndefinedValue();
case "object":
if (input === null) {
return new NullValue();
} else if (Array.isArray(input)) {
return new ArrayValue(input.map(convertToRuntimeValues));
} else {
return new ObjectValue(
new Map(Object.entries(input).map(([key, value]) => [key, convertToRuntimeValues(value)]))
);
}
case "function":
// Wrap the user's function in a runtime function
// eslint-disable-next-line @typescript-eslint/no-unused-vars
return new FunctionValue((args, _scope) => {
// NOTE: `_scope` is not used since it's in the global scope
const result = input(...args.map((x) => x.value)) ?? null; // map undefined -> null
return convertToRuntimeValues(result);
});
default:
throw new Error(`Cannot convert to runtime value: ${input}`);
}
}