odatafy-parser
Version:
generate odatafy ast from odata query parameters
102 lines (101 loc) • 3.98 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.searchParser = exports.selectParser = exports.computeParser = exports.expandParser = exports.topParser = exports.skipParser = exports.orderbyParser = exports.filterParser = exports.parseODataUrl = void 0;
const url_1 = __importDefault(require("url"));
const computeParser_1 = __importDefault(require("./parsing/computeParser"));
exports.computeParser = computeParser_1.default;
const filterParser_1 = __importDefault(require("./parsing/filterParser"));
exports.filterParser = filterParser_1.default;
const orderbyParser_1 = __importDefault(require("./parsing/orderbyParser"));
exports.orderbyParser = orderbyParser_1.default;
const skipParser_1 = __importDefault(require("./parsing/skipParser"));
exports.skipParser = skipParser_1.default;
const topParser_1 = __importDefault(require("./parsing/topParser"));
exports.topParser = topParser_1.default;
const expandParser_1 = __importDefault(require("./parsing/expandParser"));
exports.expandParser = expandParser_1.default;
const selectParser_1 = __importDefault(require("./parsing/selectParser"));
exports.selectParser = selectParser_1.default;
const searchParser_1 = __importDefault(require("./parsing/searchParser"));
exports.searchParser = searchParser_1.default;
const utils_1 = require("./utils");
const countParser_1 = __importDefault(require("./parsing/countParser"));
/**
* parse oData parameter expressions
* @param parameters oData url parameters
* @returns parsed oData parameters
*/
function parseOData(parameters) {
const result = {};
if (parameters.filter) {
result.filter = filterParser_1.default.parse(parameters.filter);
}
if (parameters.orderby) {
result.orderby = orderbyParser_1.default.parse(parameters.orderby);
}
if (parameters.skip) {
result.skip = skipParser_1.default.parse(parameters.skip);
}
if (parameters.top) {
result.top = topParser_1.default.parse(parameters.top);
}
if (parameters.expand) {
result.expand = expandParser_1.default.parse(parameters.expand);
}
if (parameters.compute) {
result.compute = computeParser_1.default.parse(parameters.compute);
}
if (parameters.select) {
result.select = selectParser_1.default.parse(parameters.select);
}
if (parameters.search) {
result.search = searchParser_1.default.parse(parameters.search);
}
if (parameters.count) {
result.count = countParser_1.default.parse(parameters.count);
}
return result;
}
/**
* parse oData parameter expressions from url
* @param oDataUrl oData url as string, from req.url
* @example //returns {top: 4}
* parseODataUrl("//https://services.odata.org/v2/northwind/northwind.svc/Customers?$top=4")
* @returns parsed oData parameters
*/
function parseODataUrl(oDataUrl) {
let query;
try {
query = url_1.default.parse(oDataUrl, true).query;
}
catch (e) {
throw (0, utils_1.getOdatafyParserError)('malformed URL');
}
const validParams = [
'filter',
'orderby',
'skip',
'top',
'expand',
'compute',
'select',
'search',
'count'
];
const params = Object.keys(query);
const parseParameters = {};
validParams.forEach((param) => {
//check if url
if (params.includes(param) && params.includes('$' + param)) {
throw (0, utils_1.getOdatafyParserError)(`Malformed oData url, cannot contain param: ${param} and param: $${param}`);
}
if (params.includes(param) || params.includes('$' + param)) {
parseParameters[param] = query[params.includes(param) ? param : '$' + param];
}
});
return parseOData(parseParameters);
}
exports.parseODataUrl = parseODataUrl;