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]> };
|
const result = {} as { [K in keyof T]: ReturnType<T[K]> };
|
||||||
|
|
||||||
for (const key in parsers) {
|
for (const key in parsers) {
|
||||||
if (!(key in val)) {
|
const value = (val as Record<string, unknown>)[key] ?? undefined;
|
||||||
throw new ParseError(`Missing prop: ${key}`, shapeName);
|
|
||||||
}
|
|
||||||
|
|
||||||
const value = (val as Record<string, unknown>)[key];
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// biome-ignore lint/style/noNonNullAssertion: Logically guaranteed
|
// biome-ignore lint/style/noNonNullAssertion: Logically guaranteed
|
||||||
|
|
|
@ -140,6 +140,33 @@ describe(Parse.shape, () => {
|
||||||
const shape = { name: Parse.string, age: Parse.number };
|
const shape = { name: Parse.string, age: Parse.number };
|
||||||
expect(() => Parse.shape(shape)(obj)).toThrow(ParseError);
|
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, () => {
|
describe(Parse.enum, () => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue