-
Notifications
You must be signed in to change notification settings - Fork 10
/
typedarray.js
45 lines (43 loc) · 1.63 KB
/
typedarray.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import getFuncName from 'get-func-name'
import { truncator, truncate, inspectProperty, inspectList } from './helpers'
const getArrayName = array => {
// We need to special case Node.js' Buffers, which report to be Uint8Array
if (typeof Buffer === 'function' && array instanceof Buffer) {
return 'Buffer'
}
if (array[Symbol.toStringTag]) {
return array[Symbol.toStringTag]
}
return getFuncName(array.constructor)
}
export default function inspectTypedArray(array, options) {
const name = getArrayName(array)
options.truncate -= name.length + 4
// Object.keys will always output the Array indices first, so we can slice by
// `array.length` to get non-index properties
const nonIndexProperties = Object.keys(array).slice(array.length)
if (!array.length && !nonIndexProperties.length) return `${name}[]`
// As we know TypedArrays only contain Unsigned Integers, we can skip inspecting each one and simply
// stylise the toString() value of them
let output = ''
for (let i = 0; i < array.length; i++) {
const string = `${options.stylize(truncate(array[i], options.truncate), 'number')}${
array[i] === array.length ? '' : ', '
}`
options.truncate -= string.length
if (array[i] !== array.length && options.truncate <= 3) {
output += `${truncator}(${array.length - array[i] + 1})`
break
}
output += string
}
let propertyContents = ''
if (nonIndexProperties.length) {
propertyContents = inspectList(
nonIndexProperties.map(key => [key, array[key]]),
options,
inspectProperty
)
}
return `${name}[ ${output}${propertyContents ? `, ${propertyContents}` : ''} ]`
}