UNPKG

ts-flex-query

Version:
67 lines 3.23 kB
"use strict"; 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