feat: enhance query handling by ignoring undefined values

- Updated query conversion logic to skip undefined values, improving robustness.
- Added tests to validate that undefined values are correctly ignored in query specifications.
This commit is contained in:
dswbx
2025-10-26 21:22:42 +01:00
parent 28390b0b84
commit 2847e64b77
4 changed files with 45 additions and 16 deletions

View File

@@ -1,6 +1,8 @@
import { test, describe, expect } from "bun:test";
import * as q from "./query";
import { parse as $parse, type ParseOptions } from "bknd/utils";
import type { PrimaryFieldType } from "modules";
import type { Generated } from "kysely";
const parse = (v: unknown, o: ParseOptions = {}) =>
$parse(q.repoQuery, v, {
@@ -186,4 +188,35 @@ describe("server/query", () => {
decode({ with: { images: {}, comments: {} } }, output);
}
});
test("types", () => {
const id = 1 as PrimaryFieldType;
const id2 = "1" as unknown as Generated<string>;
const c: q.RepoQueryIn = {
where: {
// @ts-expect-error only primitives are allowed for $eq
something: [],
// this gets ignored
another: undefined,
// @ts-expect-error null is not a valid value
null_is_okay: null,
some_id: id,
another_id: id2,
},
};
const d: q.RepoQuery = {
where: {
// @ts-expect-error only primitives are allowed for $eq
something: [],
// this gets ignored
another: undefined,
// @ts-expect-error null is not a valid value
null_is_okay: null,
some_id: id,
another_id: id2,
},
};
});
});

View File

@@ -84,8 +84,6 @@ const where = s.anyOf([s.string(), s.object({})], {
return WhereBuilder.convert(q);
},
});
//type WhereSchemaIn = s.Static<typeof where>;
//type WhereSchema = s.StaticCoerced<typeof where>;
// ------
// with
@@ -128,7 +126,7 @@ const withSchema = <Type = unknown>(self: s.Schema): s.Schema<{}, Type, Type> =>
}
}
return value as unknown as any;
return value as any;
},
}) as any;
@@ -167,15 +165,3 @@ export type RepoQueryIn = {
export type RepoQuery = s.StaticCoerced<typeof repoQuery> & {
sort: SortSchema;
};
//export type RepoQuery = s.StaticCoerced<typeof repoQuery>;
// @todo: CURRENT WORKAROUND
/* export type RepoQuery = {
limit?: number;
offset?: number;
sort?: { by: string; dir: "asc" | "desc" };
select?: string[];
with?: Record<string, RepoQuery>;
join?: string[];
where?: WhereQuery;
}; */