Skip to content
This repository was archived by the owner on May 11, 2021. It is now read-only.

Commit 484a889

Browse files
committed
Add option to coerce boolean string/number values
1 parent abe23a1 commit 484a889

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/__tests__/validation.spec.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,35 @@ it('allows converting a number into a string', () => {
201201
})
202202
})
203203

204+
it('allows coercing a boolean string/number into a boolean', () => {
205+
const result1 = validateObjectShape(
206+
'Test obj',
207+
{
208+
testBooleanNumber: 1,
209+
testBooleanNumberFalse: 0,
210+
testBooleanString: 'true',
211+
testBooleanStringFalse: 'false'
212+
},
213+
{
214+
testBooleanNumber: 'boolean',
215+
testBooleanNumberFalse: 'boolean',
216+
testBooleanString: 'boolean',
217+
testBooleanStringFalse: 'boolean'
218+
},
219+
{ coerceBooleans: true }
220+
)
221+
222+
expect(result1).toMatchObject({
223+
valid: true,
224+
result: {
225+
testBooleanNumber: true,
226+
testBooleanNumberFalse: false,
227+
testBooleanString: true,
228+
testBooleanStringFalse: false
229+
}
230+
})
231+
})
232+
204233
it('when wrapping an item in a array ensure it coerced correctly', () => {
205234
const result1 = validateObjectShape(
206235
'Test obj',

src/index.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export interface ValidationOptions {
5454
* be valid if inside an array, it will automatically be wrapped
5555
*/
5656
coerceValidObjectIntoArray?: boolean
57+
coerceBooleans?: boolean
5758
}
5859

5960
export interface OptionalShape<T> {
@@ -240,6 +241,15 @@ export function validateValue<T extends ValidationKeyType<any>>(
240241

241242
if (valueType === 'boolean') {
242243
if (typeof value !== 'boolean') {
244+
if (options.coerceBooleans) {
245+
if (value === 'true' || value === 1) {
246+
return { valid: true, result: true }
247+
}
248+
if (value === 'false' || value === 0) {
249+
return { valid: true, result: false }
250+
}
251+
}
252+
243253
const errorMessage = `Expected ${valueDescription} to be type: boolean, was ${typeof value}`
244254
return {
245255
valid: false,

0 commit comments

Comments
 (0)