-
Notifications
You must be signed in to change notification settings - Fork 472
/
Copy pathpretty-dom.js
105 lines (93 loc) · 2.92 KB
/
pretty-dom.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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import * as prettyFormat from 'pretty-format'
import createDOMElementFilter from './DOMElementFilter'
import {getUserCodeFrame} from './get-user-code-frame'
import {getDocument} from './helpers'
import {getConfig} from './config'
const shouldHighlight = () => {
if (typeof process === 'undefined') {
// Don't colorize in non-node environments (e.g. Browsers)
return false
}
let colors
// Try to safely parse env COLORS: We will default behavior if any step fails.
try {
const colorsJSON = process.env?.COLORS
if (colorsJSON) {
colors = JSON.parse(colorsJSON)
}
} catch {
// If this throws, process.env?.COLORS wasn't parsable. Since we only
// care about `true` or `false`, we can safely ignore the error.
}
if (typeof colors === 'boolean') {
// If `colors` is set explicitly (both `true` and `false`), use that value.
return colors
} else {
// If `colors` is not set, colorize if we're in node.
return process.versions !== undefined && process.versions.node !== undefined
}
}
const {DOMCollection} = prettyFormat.plugins
// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType#node_type_constants
const ELEMENT_NODE = 1
const COMMENT_NODE = 8
// https://github.com/facebook/jest/blob/615084195ae1ae61ddd56162c62bbdda17587569/packages/pretty-format/src/plugins/DOMElement.ts#L50
function filterCommentsAndDefaultIgnoreTagsTags(value) {
return (
value.nodeType !== COMMENT_NODE &&
(value.nodeType !== ELEMENT_NODE ||
!value.matches(getConfig().defaultIgnore))
)
}
function prettyDOM(dom, maxLength, options = {}) {
if (!dom) {
dom = getDocument().body
}
if (typeof maxLength !== 'number') {
maxLength =
(typeof process !== 'undefined' &&
typeof process.env !== 'undefined' &&
process.env.DEBUG_PRINT_LIMIT) ||
7000
}
if (maxLength === 0) {
return ''
}
if (dom.documentElement) {
dom = dom.documentElement
}
let domTypeName = typeof dom
if (domTypeName === 'object') {
domTypeName = dom.constructor.name
} else {
// To don't fall with `in` operator
dom = {}
}
if (!('outerHTML' in dom)) {
throw new TypeError(
`Expected an element or document but got ${domTypeName}`,
)
}
const {
filterNode = filterCommentsAndDefaultIgnoreTagsTags,
...prettyFormatOptions
} = options
const debugContent = prettyFormat.format(dom, {
plugins: [createDOMElementFilter(filterNode), DOMCollection],
printFunctionName: false,
highlight: shouldHighlight(),
...prettyFormatOptions,
})
return maxLength !== undefined && dom.outerHTML.length > maxLength
? `${debugContent.slice(0, maxLength)}...`
: debugContent
}
const logDOM = (...args) => {
const userCodeFrame = getUserCodeFrame()
if (userCodeFrame) {
console.log(`${prettyDOM(...args)}\n\n${userCodeFrame}`)
} else {
console.log(prettyDOM(...args))
}
}
export {prettyDOM, logDOM, prettyFormat}