odata-builder
Generating odata queries typesafe. No more worries about wrong queries. Know that the query is correct while writing it.

Install
To install the package use your favourite package mananger, e.g.:
npm install --save odata-builder
or
yarn add odata-builder
Usage
const item = {
someProperty: 'someValue',
}
const queryBuilder = new OdataQueryBuilder<typeof item>()
.count()
.filter({field: 'someProperty', operator: 'eq', value: 'test'})
.skip(10)
.top(100)
.select('someOtherProperty1', 'someOtherProperty2')
.toQuery();
If you want to count and only receive the amount of data:
const queryBuilder = new OdataQueryBuilder<MyAwesomeDto>()
.count(true)
.filter(...)
.toQuery();
You can also decide if you want to have single quotes when querying with guid
import { Guid, OdataQueryBuilder } from 'odata-builder';
type MyAwesomeDto = {
id: Guid;
...
}
const filter = {
field: 'id',
operator: 'eq'
value: 'f92477a9-5761-485a-b7cd-30561e2f888b',
removeQuotes: true,
}
const queryBuilder = new OdataQueryBuilder<MyAwesomeDto>()
.filter(filter)
.toQuery();
If there is an array in your item, you can use lambda expressions in oData to filter for them:
type MyAwesomeDto = {
...
someProperty: string[]
...
}
const queryBuilder = new OdataQueryBuilder<MyAwesomeDto>()
.filter({
field: 'someProperty',
operator: 'contains',
value: 'test',
lambdaOperator: 'any',
ignoreCase: true,
})
.toQuery();
There is also autocomplete for every property of the filter.
If the inner array ist an array of objects you need to provide the inner field for the filter:
type MyAwesomeDto = {
...
someProperty: { someInnerProperty: string }[]
...
}
const queryBuilder = new OdataQueryBuilder<MyAwesomeDto>()
.filter({
field: 'someProperty',
operator: 'contains',
value: 'test',
lambdaOperator: 'any',
innerProperty: 'someInnerProperty',
ignoreCase: true,
})
.toQuery();
If you want to choose the filter logic or you need to filter for two depended fields there is the CombinedFilter:
const queryBuilder = new ODataQueryBuilder<MyAwesomeDto>
.filter({
logic: 'or',
filters: [
{ field: 'x', operator: 'eq', value: 'test' },
{ field: 'y', operator: 'eq', value: 5 },
],
})
.toQuery();
You could combine it with multiple Combined filters or even with the single QueryFilter.
If you want to add a function to your codebase that encapsulates the query creation you can do it like this:
const item = {
x: 4,
y: 'test',
z: new Date(Date.now()),
};
const testFn = (
field: FilterFields<typeof item, string>,
operator: FilterOperators<string>,
value: string,
): string => {
const queryBuilder = new OdataQueryBuilder<typeof item>();
queryBuilder.filter({ field, operator, value });
return queryBuilder.toQuery();
};
const result = testFn('y', 'eq', 'test');
If you need to expand a property you can use the expand function:
const item = {
x: { someProperty: '' },
}
const queryBuilder = new OdataQueryBuilder<typeof item>();
.expand('x')
.toQuery();
You can do this with inner properties as well:
const item = {
x: { someProperty: { nestedProperty: '' } },
}
const queryBuilder = new OdataQueryBuilder<typeof item>();
.expand('x/someProperty')
.toQuery();
Features
- Generate oData4 queries with typesafe objects.
- Check of field, value and possible operator for a filter
- Orderby, Select only fields of your model
- Autocomplete for every property in your filter, orderby, etc...
- Filtering of arrays in your model
- Filters can be added with strings that will get typechecked
- Generate Queries to manipluate data (soon™)
ToDos
Any feature missing here? Please open an issue and add your feature request.