Skip to content

Commit d35ff17

Browse files
authored
improve mechanics and test coverage for largeArraySize-option (#575)
1 parent 0133210 commit d35ff17

File tree

4 files changed

+116
-2
lines changed

4 files changed

+116
-2
lines changed

index.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,14 @@ function build (schema, options) {
107107
}
108108

109109
if (options.largeArraySize) {
110-
if (!Number.isNaN(Number.parseInt(options.largeArraySize, 10))) {
110+
if (typeof options.largeArraySize === 'string' && Number.isFinite(Number.parseInt(options.largeArraySize, 10))) {
111+
largeArraySize = Number.parseInt(options.largeArraySize, 10)
112+
} else if (typeof options.largeArraySize === 'number' && Number.isInteger(options.largeArraySize)) {
111113
largeArraySize = options.largeArraySize
114+
} else if (typeof options.largeArraySize === 'bigint') {
115+
largeArraySize = Number(options.largeArraySize)
112116
} else {
113-
throw new Error(`Unsupported large array size. Expected integer-like, got ${options.largeArraySize}`)
117+
throw new Error(`Unsupported large array size. Expected integer-like, got ${typeof options.largeArraySize} with value ${options.largeArraySize}`)
114118
}
115119
}
116120

test/array.test.js

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,3 +529,86 @@ buildTest({
529529
largeArraySize: 2e4,
530530
largeArrayMechanism: 'default'
531531
})
532+
533+
test('error on invalid value for largeArraySize /1', (t) => {
534+
t.plan(1)
535+
536+
t.throws(() => build({
537+
title: 'large array of null values with default mechanism',
538+
type: 'object',
539+
properties: {
540+
ids: {
541+
type: 'array',
542+
items: { type: 'null' }
543+
}
544+
}
545+
}, {
546+
largeArraySize: 'invalid'
547+
}), Error('Unsupported large array size. Expected integer-like, got string with value invalid'))
548+
})
549+
550+
test('error on invalid value for largeArraySize /2', (t) => {
551+
t.plan(1)
552+
553+
t.throws(() => build({
554+
title: 'large array of null values with default mechanism',
555+
type: 'object',
556+
properties: {
557+
ids: {
558+
type: 'array',
559+
items: { type: 'null' }
560+
}
561+
}
562+
}, {
563+
largeArraySize: Infinity
564+
}), Error('Unsupported large array size. Expected integer-like, got number with value Infinity'))
565+
})
566+
567+
test('error on invalid value for largeArraySize /3', (t) => {
568+
t.plan(1)
569+
570+
t.throws(() => build({
571+
title: 'large array of null values with default mechanism',
572+
type: 'object',
573+
properties: {
574+
ids: {
575+
type: 'array',
576+
items: { type: 'null' }
577+
}
578+
}
579+
}, {
580+
largeArraySize: [200]
581+
}), Error('Unsupported large array size. Expected integer-like, got object with value 200'))
582+
})
583+
584+
buildTest({
585+
title: 'large array of integers with largeArraySize is bigint',
586+
type: 'object',
587+
properties: {
588+
ids: {
589+
type: 'array',
590+
items: { type: 'integer' }
591+
}
592+
}
593+
}, {
594+
ids: new Array(2e4).fill(42)
595+
}, {
596+
largeArraySize: 20000n,
597+
largeArrayMechanism: 'default'
598+
})
599+
600+
buildTest({
601+
title: 'large array of integers with largeArraySize is valid string',
602+
type: 'object',
603+
properties: {
604+
ids: {
605+
type: 'array',
606+
items: { type: 'integer' }
607+
}
608+
}
609+
}, {
610+
ids: new Array(1e4).fill(42)
611+
}, {
612+
largeArraySize: '10000',
613+
largeArrayMechanism: 'default'
614+
})

types/index.d.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,22 @@ declare namespace build {
169169
* Running mode of fast-json-stringify
170170
*/
171171
mode?: 'debug' | 'standalone'
172+
173+
/**
174+
* Large arrays are defined as arrays containing, by default, `20000`
175+
* elements or more. That value can be adjusted via the option parameter
176+
* `largeArraySize`.
177+
*
178+
* @default 20000
179+
*/
180+
largeArraySize?: number | string | BigInt
181+
182+
/**
183+
* Specify the function on how large Arrays should be stringified.
184+
*
185+
* @default 'default'
186+
*/
187+
largeArrayMechanism?: 'default' | 'json-stringify'
172188
}
173189

174190
export const validLargeArrayMechanisms: string[]

types/index.test-d.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,3 +217,14 @@ const stringify7 = build({
217217
});
218218
stringify7(true);
219219
expectError(stringify7("a string"));
220+
221+
// largeArrayMechanism
222+
223+
build({}, { largeArrayMechanism: 'json-stringify'} )
224+
build({}, { largeArrayMechanism: 'default'} )
225+
expectError(build({} as Schema, { largeArrayMechanism: 'invalid'} ))
226+
227+
build({}, { largeArraySize: 2000 } )
228+
build({}, { largeArraySize: '2e4' } )
229+
build({}, { largeArraySize: 2n } )
230+
expectError(build({} as Schema, { largeArraySize: ['asdf']} ))

0 commit comments

Comments
 (0)