-
-
Notifications
You must be signed in to change notification settings - Fork 135
/
Copy pathdom-to-react.js
102 lines (92 loc) Β· 3.2 KB
/
dom-to-react.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
'use strict';
/**
* Module dependencies.
*/
var assert = require('assert');
var React = require('react');
var htmlToDOMServer = require('../lib/html-to-dom-server');
var domToReact = require('../lib/dom-to-react');
var helpers = require('./helpers/');
var data = require('./data');
/**
* Tests for `domToReact`.
*/
describe('dom-to-react parser', function() {
it('converts single DOM node to React', function() {
var html = data.html.single;
var reactElement = domToReact(htmlToDOMServer(html));
assert(React.isValidElement(reactElement));
assert.deepEqual(
reactElement,
React.createElement('p', {}, 'foo')
);
});
it('converts multiple DOM nodes to React', function() {
var html = data.html.multiple;
var reactElements = domToReact(htmlToDOMServer(html));
reactElements.forEach(function(reactElement) {
assert(React.isValidElement(reactElement));
assert(reactElement.key);
});
assert.deepEqual(
reactElements,
[
React.createElement('p', { key: 0 }, 'foo'),
React.createElement('p', { key: 1 }, 'bar')
]
);
});
// https://facebook.github.io/react/docs/forms.html#why-textarea-value
it('converts <textarea> correctly', function() {
var html = data.html.textarea;
var reactElement = domToReact(htmlToDOMServer(html));
assert(React.isValidElement(reactElement));
assert.deepEqual(
reactElement,
React.createElement('textarea', {
defaultValue: 'foo'
}, null)
);
});
it('converts <script> correctly', function() {
var html = data.html.script;
var reactElement = domToReact(htmlToDOMServer(html));
assert(React.isValidElement(reactElement));
assert.deepEqual(
reactElement,
React.createElement('script', {
dangerouslySetInnerHTML: {
__html: 'alert(1 < 2);'
}
}, null)
);
});
it('does not have `children` for void elements', function() {
var html = data.html.img;
var reactElement = domToReact(htmlToDOMServer(html));
assert(!reactElement.props.children);
});
it('does not throw an error for void elements', function() {
var html = data.html.void;
var reactElements = domToReact(htmlToDOMServer(html));
assert.doesNotThrow(function() {
helpers.render(React.createElement('div', {}, reactElements));
});
});
it('skips HTML comments', function() {
var html = [data.html.single, data.html.comment, data.html.single].join('');
var reactElements = domToReact(htmlToDOMServer(html));
reactElements.forEach(function(reactElement) {
assert(React.isValidElement(reactElement));
assert(reactElement.key);
});
assert.deepEqual(
reactElements,
[
React.createElement('p', { key: 0 }, 'foo'),
// comment is in the middle
React.createElement('p', { key: 2 }, 'foo')
]
);
});
});