Skip to content

Commit

Permalink
Merge pull request #289 from social-native/fix/autocoerce-before-filt…
Browse files Browse the repository at this point in the history
…erTransformer

FilterTransformer should happen after coercion
  • Loading branch information
dearsaturn authored Sep 24, 2021
2 parents 567bb36 + 2ac7974 commit 2592db0
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 11 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "graphql-connections",
"version": "9.1.1",
"version": "9.1.2",
"description": "Build and handle Relay-like GraphQL connections using a Knex query builder",
"main": "dist/index.cjs.js",
"module": "dist/index.es.js",
Expand Down
22 changes: 12 additions & 10 deletions src/query_builder/knex_base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,34 +117,36 @@ export default class KnexQueryBuilder implements IQueryBuilder<Knex> {
// [string, string, string | number | null]
// tslint:disable-next-line: cyclomatic-complexity
private filterArgs(filter: IFilter) {
const {field, operator, value} = this.filterTransformer(filter);

if (this.useSuggestedValueLiteralTransforms) {
const coercedValue = typeof value === 'string' ? coerceStringValue(value) : value;
// tslint:disable-next-line: no-shadowed-variable
const {field, operator, value} = this.filterTransformer({
...filter,
value:
typeof filter.value === 'string'
? coerceStringValue(filter.value)
: filter.value
});

if (coercedValue === null && operator.toLowerCase() === '=') {
if (value === null && operator.toLowerCase() === '=') {
return [
(builder: QueryBuilder) => {
builder.whereNull(this.computeFilterField(field));
}
];
}

if (coercedValue === null && operator.toLowerCase() === '<>') {
if (value === null && operator.toLowerCase() === '<>') {
return [
(builder: QueryBuilder) => {
builder.whereNotNull(this.computeFilterField(field));
}
];
}

return [
this.computeFilterField(field),
this.computeFilterOperator(operator),
coercedValue
];
return [this.computeFilterField(field), this.computeFilterOperator(operator), value];
}

const {field, operator, value} = this.filterTransformer(filter);
return [this.computeFilterField(field), this.computeFilterOperator(operator), value];
}

Expand Down
4 changes: 4 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@ export type QueryBuilderOptions = IKnexQueryBuilderOptions | IKnexMySQLQueryBuil

export interface IKnexQueryBuilderOptions {
filterMap?: {[operator: string]: string};
/**
* If given with `useSuggestedValueLiteralTransforms`
* note that coercion happens FIRST, and then filterTransformer.
*/
filterTransformer?: FilterTransformer;
useSuggestedValueLiteralTransforms?: boolean;
}
Expand Down

0 comments on commit 2592db0

Please sign in to comment.