-
Notifications
You must be signed in to change notification settings - Fork 742
/
serial-virtual-node.js
88 lines (79 loc) · 2.18 KB
/
serial-virtual-node.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
// eslint-disable-next-line no-unused-vars
class SerialVirtualNode extends axe.AbstractVirtualNode {
/**
* Convert a serialised node into a VirtualNode object
* @param {Object} node Serialised node
*/
constructor(serialNode) {
super();
this._props = normaliseProps(serialNode);
this._attrs = normaliseAttrs(serialNode);
}
// Accessof for DOM node properties
get props() {
return this._props;
}
/**
* Get the value of the given attribute name.
* @param {String} attrName The name of the attribute.
* @return {String|null} The value of the attribute or null if the attribute does not exist
*/
attr(attrName) {
return this._attrs[attrName] || null;
}
/**
* Determine if the element has the given attribute.
* @param {String} attrName The name of the attribute
* @return {Boolean} True if the element has the attribute, false otherwise.
*/
hasAttr(attrName) {
return this._attrs[attrName] !== undefined;
}
}
/**
* Convert between serialised props and DOM-like properties
* @param {Object} serialNode
* @return {Object} normalProperties
*/
function normaliseProps(serialNode) {
let { nodeName, nodeType = 1 } = serialNode;
axe.utils.assert(
nodeType === 1,
`nodeType has to be undefined or 1, got '${nodeType}'`
);
axe.utils.assert(
typeof nodeName === 'string',
`nodeName has to be a string, got '${nodeName}'`
);
const props = {
...serialNode,
nodeType,
nodeName: nodeName.toLowerCase()
};
delete props.attributes;
return Object.freeze(props);
}
/**
* Convert between serialised attributes and DOM-like attributes
* @param {Object} serialNode
* @return {Object} normalAttributes
*/
function normaliseAttrs({ attributes = {} }) {
const attrMap = {
htmlFor: 'for',
className: 'class'
};
return Object.keys(attributes).reduce((attrs, attrName) => {
const value = attributes[attrName];
axe.utils.assert(
typeof value !== 'object' || value === null,
`expects attributes not to be an object, '${attrName}' was`
);
if (value !== undefined) {
const mappedName = attrMap[attrName] || attrName;
attrs[mappedName] = value !== null ? String(value) : null;
}
return attrs;
}, {});
}
axe.SerialVirtualNode = SerialVirtualNode;