mojotech / mojotech/json-type-validation
object() decoder needs a 'strict' option to disallow undefined fields
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 154
- Forks
- 14
- PR merge metrics
- No merged PRs in 30d
Description
Just discovered this awesome library. Just what I was looking for! Thanks very much.
I had a look at the code for the object decoder and noted that it iterates over the fields of the fields of the object specification and returns as a result only these fields. That great for cleaning JSON input values, however I often need to check that fields in the input json object are only those defined by the object decoder. To support this I think we need a strict argument on the object() decoder that checks and reports an error if any additional fields are found in the json object.
static object<A>(decoders?: DecoderObject<A>, strict?: boolean = false) {
return new Decoder((json: unknown) => {
if (isJsonObject(json) && decoders) {
let obj: any = {};
for (const key in decoders) {
if (decoders.hasOwnProperty(key)) {
const r = decoders[key].decode(json[key]);
if (r.ok === true) {
// tslint:disable-next-line:strict-type-predicates
if (r.result !== undefined) {
obj[key] = r.result;
}
} else if (json[key] === undefined) {
return Result.err({message: `the key '${key}' is required but was not present`});
} else {
return Result.err(prependAt(`.${key}`, r.error));
}
}
}
// ADDED
if (strict) {
for (const key in json) {
if (!decoders.hasOwnProperty(key)) {
return Result.err({message: `an undefined key '${key}' is present in the object`});
}
}
}
return Result.ok(obj);
} else if (isJsonObject(json)) {
return Result.ok(json);
} else {
return Result.err({message: expectedGot('an object', json)});
}
});
}
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in src/decoder.ts around the object decoder implementation at line 272 and review how it currently filters fields from the input object. Add the requested optional strict behavior so extra input keys produce an error, while the existing default behavior remains unchanged; verify both paths against the library's existing validation checks.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- backend-api-design
- Issue type
- Feature
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 50/100