UNPKG

@shko.online/dataverse-odata

Version:

This package will help parse OData strings (only the Microsoft Dataverse subset). It can be used as a validator, or you can build some javascript library which consumes the output of this library.

78 lines (76 loc) 2.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getOrderByFromParser = void 0; var _getAliasedProperty = require("./getAliasedProperty"); var _atMostOnce = require("./validators/atMostOnce"); var _hasContent = require("./validators/hasContent"); const option = '$orderby'; /** * Parses the {@link ODataOrderBy.$orderby $orderby} query * @returns Returns `false` when the parse has an error */ const getOrderByFromParser = (parser, result) => { let value = parser.getAll(option); if (value.length === 0) { return true; } if (!(0, _atMostOnce.atMostOnce)(option, value, result) || !(0, _hasContent.hasContent)(option, value, result)) { return false; } let $orderby = value[0].trimEnd(); let $orderbyParts = $orderby.split(','); const orderByArray = []; let position = 0; for (const element of $orderbyParts) { const parts = Array.from(element.matchAll(/\s*(\S+)/gi)); if (parts.length > 2) { position = position + parts[0][0].length + parts[1][0].length + parts[2][0].length; result.error = { code: '0x80060888', message: `Syntax error at position ${position} in '${$orderby}'.` }; return false; } if (!/^[@a-zA-Z]\w+/gi.test(parts[0][1])) { position = position + parts[0][0].length; result.error = { code: '0x80060888', message: `Syntax error at position ${position} in '${$orderby}'.` }; return false; } const orderBy = { column: parts[0][1], asc: true // default is ascending }; if (parts[0][1].startsWith('@')) { orderBy.column = (0, _getAliasedProperty.getAliasedProperty)(parser, result, parts[0][1]); if (!orderBy.column) { return false; } } if (parts.length === 1) { orderByArray.push(orderBy); continue; } if (parts[1][1].toLowerCase() === 'asc') { orderBy.asc = true; orderByArray.push(orderBy); } else if (parts[1][1].toLowerCase() === 'desc') { orderBy.asc = false; orderByArray.push(orderBy); } else { position = position + parts[0][0].length + parts[1][0].length; result.error = { code: '0x80060888', message: `Syntax error at position ${position} in '${$orderby}'.` }; return false; } } result.$orderby = orderByArray; return true; }; exports.getOrderByFromParser = getOrderByFromParser;