ts-flex-query
Version:
Flexible and type-safe data queries
67 lines • 3.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExpressionSerializer = void 0;
const expressions_1 = require("../../expressions");
const utils_1 = require("../../helpers/utils");
const definitions_1 = require("../helpers/definitions");
const function_serializer_1 = require("./function-serializer");
class ExpressionSerializer {
/**
* Serializes an expression to an OData expression.
* @param serializedVariableValues Maps variable symbols to serialized values or null if this variable represents the current base object.
* @returns The expression string, or null if the expression refers to the current base object (represented by a variable with serializedVariableValues[V] = null).
*/
static serializeExpression(expression, serializedVariableValues) {
if (expression instanceof expressions_1.ConstantExpression) {
if (!(0, definitions_1.isODataSerializable)(expression.value)) {
throw new Error(`Unserializable value: ${expression.value}`);
}
return ExpressionSerializer.serializeValue(expression.value);
}
if (expression instanceof expressions_1.FieldExpression) {
const inputResult = ExpressionSerializer.serializeExpression(expression.input, serializedVariableValues);
return inputResult ? `${inputResult}/${expression.field}` : expression.field;
}
if (expression instanceof expressions_1.FunctionApplicationExpression) {
const serializer = new function_serializer_1.FunctionSerializer((expr, variables) => ExpressionSerializer.serializeExpression(expr, variables), serializedVariableValues);
return `(${serializer.serialize(expression)})`;
}
if (expression instanceof expressions_1.VariableExpression) {
const variableValue = serializedVariableValues[expression.symbol];
if (variableValue === undefined) {
throw new Error(`Access to undefined variable: ${expression.symbol.toString()}`);
}
return variableValue;
}
throw new Error(`Unsupported expression: ${expression.constructor.name}`);
}
static serializeValue(value) {
switch (typeof value) {
case 'string':
return `'${value}'`;
case 'symbol':
return `'${String(value)}'`;
case 'number':
case 'bigint':
case 'boolean':
return value.toString();
case 'object':
if (value === null) {
return 'null';
}
else if (value instanceof Date) {
return value.toISOString();
}
if (Array.isArray(value)) {
return `(${value.map(ExpressionSerializer.serializeValue).join(',')})`;
}
return (0, utils_1.unexpected)(value);
case 'undefined':
return 'null';
default:
return (0, utils_1.unexpected)(value);
}
}
}
exports.ExpressionSerializer = ExpressionSerializer;
//# sourceMappingURL=expression-serializer.js.map