Allow optional shape entries
This commit is contained in:
parent
5ce10bed57
commit
26db320717
2 changed files with 31 additions and 8 deletions
|
@ -149,11 +149,7 @@ export const Parse = {
|
|||
const result = {} as { [K in keyof T]: ReturnType<T[K]> };
|
||||
|
||||
for (const key in parsers) {
|
||||
if (!(key in val)) {
|
||||
throw new ParseError(`Missing prop: ${key}`, shapeName);
|
||||
}
|
||||
|
||||
const value = (val as Record<string, unknown>)[key];
|
||||
const value = (val as Record<string, unknown>)[key] ?? undefined;
|
||||
|
||||
try {
|
||||
// biome-ignore lint/style/noNonNullAssertion: Logically guaranteed
|
||||
|
|
|
@ -140,6 +140,33 @@ describe(Parse.shape, () => {
|
|||
const shape = { name: Parse.string, age: Parse.number };
|
||||
expect(() => Parse.shape(shape)(obj)).toThrow(ParseError);
|
||||
});
|
||||
|
||||
test("allows optional object entries", () => {
|
||||
const parseThing = Parse.shape({
|
||||
name: Parse.string,
|
||||
another: Parse.optional(Parse.string),
|
||||
});
|
||||
|
||||
const result = parseThing({
|
||||
name: "hello",
|
||||
});
|
||||
|
||||
expect(result).toEqual({
|
||||
name: "hello",
|
||||
another: undefined,
|
||||
});
|
||||
});
|
||||
|
||||
test("throws when a required value is missing", () => {
|
||||
const parseThing = Parse.shape({
|
||||
name: Parse.string,
|
||||
another: Parse.optional(Parse.string),
|
||||
});
|
||||
|
||||
expect(() => {
|
||||
parseThing({ another: "hello" });
|
||||
}).toThrow(ParseError);
|
||||
});
|
||||
});
|
||||
|
||||
describe(Parse.enum, () => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue