on master help sign in
.travis.yml+11−7
since splitsnapshots
unifiedsplit
@@ -25,9 +25,6 @@ matrix:
25 - name: "build (beta)"
25 - name: "build (beta)"
26 rust: beta
26 rust: beta
27 script: INSTALL=1 ./build.sh
27 script: INSTALL=1 ./build.sh
28− - name: "build (nightly)"
29− rust: nightly
30− script: INSTALL=1 ./build.sh
31 - name: "headless browser tests (firefox)"
28 - name: "headless browser tests (firefox)"
32 rust: stable
29 rust: stable
33 addons:
30 addons:
@@ -37,10 +34,17 @@ matrix:
37 rust: stable
34 rust: stable
38 install: echo "no install"
35 install: echo "no install"
39 script: cargo test --all
36 script: cargo test --all
37+
38+ # TODO: A bug in `rustc` is making `js-sys` broken on nightly:
39+ # https://github.com/rust-lang/rust/issues/69315
40+ # - name: "build (nightly)"
41+ # rust: nightly
42+ # script: INSTALL=1 ./build.sh
40− - name: "check native benches"
43+ # - name: "check native benches"
41− rust: nightly
44+ # rust: nightly
42− install: echo "no install"
45+ # install: echo "no install"
43− script: cargo check --benches --features xxx-unstable-internal-use-only
46+ # script: cargo check --benches --features xxx-unstable-internal-use-only
47+
44 # TODO: `chromedriver` is complaining about ports or something. Temporarily
48 # TODO: `chromedriver` is complaining about ports or something. Temporarily
45 # disable in CI until we figure it out.
49 # disable in CI until we figure it out.
46 # - name: "headless browser tests (chrome)"
50 # - name: "headless browser tests (chrome)"
Cargo.lock+500−504
@@ -1,104 +1,71 @@
1# This file is automatically @generated by Cargo.
1# This file is automatically @generated by Cargo.
2# It is not intended for manual editing.
2# It is not intended for manual editing.
3[[package]]
3[[package]]
4−name = "aho-corasick"
4+name = "anyhow"
5−version = "0.7.3"
5+version = "1.0.25"
6source = "registry+https://github.com/rust-lang/crates.io-index"
6source = "registry+https://github.com/rust-lang/crates.io-index"
7−dependencies = [
8− "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
9−]
10−
11−[[package]]
12−name = "arrayvec"
13−version = "0.4.10"
14−source = "registry+https://github.com/rust-lang/crates.io-index"
15−dependencies = [
16− "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
17−]
18
7
19[[package]]
8[[package]]
20name = "atty"
9name = "atty"
21−version = "0.2.11"
10+version = "0.2.13"
22source = "registry+https://github.com/rust-lang/crates.io-index"
11source = "registry+https://github.com/rust-lang/crates.io-index"
23dependencies = [
12dependencies = [
24− "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
25− "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
13+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
26− "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
14+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
27]
15]
28
16
29[[package]]
17[[package]]
30name = "autocfg"
18name = "autocfg"
31−version = "0.1.2"
19+version = "0.1.7"
32source = "registry+https://github.com/rust-lang/crates.io-index"
20source = "registry+https://github.com/rust-lang/crates.io-index"
33
21
34[[package]]
22[[package]]
35−name = "backtrace"
23+name = "bitflags"
36−version = "0.3.15"
24+version = "1.2.1"
37source = "registry+https://github.com/rust-lang/crates.io-index"
25source = "registry+https://github.com/rust-lang/crates.io-index"
38−dependencies = [
39− "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
40− "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
41− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
42− "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
43− "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
44− "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
45−]
46
26
47[[package]]
27[[package]]
48−name = "backtrace-sys"
28+name = "bstr"
49−version = "0.1.28"
29+version = "0.2.8"
50source = "registry+https://github.com/rust-lang/crates.io-index"
30source = "registry+https://github.com/rust-lang/crates.io-index"
51dependencies = [
31dependencies = [
32+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
52− "cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)",
33+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
34+ "regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
53− "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
35+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
54]
36]
55
37
56−[[package]]
57−name = "bitflags"
58−version = "1.1.0"
59−source = "registry+https://github.com/rust-lang/crates.io-index"
60−
61[[package]]
38[[package]]
62name = "bumpalo"
39name = "bumpalo"
63−version = "2.5.0"
40+version = "2.6.0"
64source = "registry+https://github.com/rust-lang/crates.io-index"
41source = "registry+https://github.com/rust-lang/crates.io-index"
65
42
66[[package]]
43[[package]]
67name = "byteorder"
44name = "byteorder"
68−version = "1.3.1"
45+version = "1.3.2"
69source = "registry+https://github.com/rust-lang/crates.io-index"
46source = "registry+https://github.com/rust-lang/crates.io-index"
70
47
71[[package]]
48[[package]]
72name = "cast"
49name = "cast"
73−version = "0.2.2"
50+version = "0.2.3"
74−source = "registry+https://github.com/rust-lang/crates.io-index"
75−
76−[[package]]
77−name = "cc"
78−version = "1.0.34"
79source = "registry+https://github.com/rust-lang/crates.io-index"
51source = "registry+https://github.com/rust-lang/crates.io-index"
52+dependencies = [
53+ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
54+]
80
55
81[[package]]
56[[package]]
82name = "cfg-if"
57name = "cfg-if"
83−version = "0.1.9"
58+version = "0.1.10"
84source = "registry+https://github.com/rust-lang/crates.io-index"
59source = "registry+https://github.com/rust-lang/crates.io-index"
85
60
86[[package]]
61[[package]]
87name = "clap"
62name = "clap"
88−version = "2.32.0"
63+version = "2.33.0"
89−source = "registry+https://github.com/rust-lang/crates.io-index"
90−dependencies = [
91− "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
92− "textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
93− "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
94−]
95−
96−[[package]]
97−name = "cloudabi"
98−version = "0.0.3"
99source = "registry+https://github.com/rust-lang/crates.io-index"
64source = "registry+https://github.com/rust-lang/crates.io-index"
100dependencies = [
65dependencies = [
66+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
67+ "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
101− "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
68+ "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
102]
69]
103
70
104[[package]]
71[[package]]
@@ -106,122 +73,132 @@ name = "console_error_panic_hook"
106version = "0.1.6"
73version = "0.1.6"
107source = "registry+https://github.com/rust-lang/crates.io-index"
74source = "registry+https://github.com/rust-lang/crates.io-index"
108dependencies = [
75dependencies = [
109− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
76+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
110− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
77+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
111]
78]
112
79
113[[package]]
80[[package]]
114name = "console_log"
81name = "console_log"
115−version = "0.1.2"
82+version = "0.2.0"
116source = "registry+https://github.com/rust-lang/crates.io-index"
83source = "registry+https://github.com/rust-lang/crates.io-index"
117dependencies = [
84dependencies = [
118− "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
85+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
119− "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
86+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
120]
87]
121
88
122[[package]]
89[[package]]
123name = "criterion"
90name = "criterion"
124−version = "0.2.11"
91+version = "0.3.3"
125−source = "registry+https://github.com/rust-lang/crates.io-index"
92+source = "registry+https://github.com/rust-lang/crates.io-index"
126−dependencies = [
93+dependencies = [
127− "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
94+ "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
128− "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
95+ "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
129− "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
96+ "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
130− "criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
97+ "criterion-plot 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
131− "csv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
98+ "csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
132− "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
99+ "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
133− "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
134− "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
100+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
135− "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
101+ "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
136− "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
137− "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
102+ "oorandom 11.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
138− "rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
103+ "plotters 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
139− "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
104+ "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
140− "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
105+ "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
106+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
141− "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
107+ "serde_cbor 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
142− "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
108+ "serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
143− "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
109+ "serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)",
144− "tinytemplate 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
110+ "tinytemplate 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
145− "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
111+ "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
146]
112]
147
113
148[[package]]
114[[package]]
149name = "criterion-plot"
115name = "criterion-plot"
150−version = "0.3.1"
116+version = "0.4.3"
151source = "registry+https://github.com/rust-lang/crates.io-index"
117source = "registry+https://github.com/rust-lang/crates.io-index"
152dependencies = [
118dependencies = [
153− "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
154− "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
119+ "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
155− "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
120+ "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
156]
121]
157
122
158[[package]]
123[[package]]
159name = "crossbeam-deque"
124name = "crossbeam-deque"
160−version = "0.2.0"
125+version = "0.7.2"
161source = "registry+https://github.com/rust-lang/crates.io-index"
126source = "registry+https://github.com/rust-lang/crates.io-index"
162dependencies = [
127dependencies = [
163− "crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
128+ "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
164− "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
129+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
165]
130]
166
131
167[[package]]
132[[package]]
168name = "crossbeam-epoch"
133name = "crossbeam-epoch"
169−version = "0.3.1"
134+version = "0.8.0"
170source = "registry+https://github.com/rust-lang/crates.io-index"
135source = "registry+https://github.com/rust-lang/crates.io-index"
171dependencies = [
136dependencies = [
172− "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
137+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
173− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
138+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
174− "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
139+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
175− "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
140+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
176− "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
177− "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
141+ "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
142+ "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
143+]
144+
145+[[package]]
146+name = "crossbeam-queue"
147+version = "0.2.0"
148+source = "registry+https://github.com/rust-lang/crates.io-index"
149+dependencies = [
178− "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
150+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
179]
151]
180
152
181[[package]]
153[[package]]
182name = "crossbeam-utils"
154name = "crossbeam-utils"
183−version = "0.2.2"
155+version = "0.7.0"
184source = "registry+https://github.com/rust-lang/crates.io-index"
156source = "registry+https://github.com/rust-lang/crates.io-index"
185dependencies = [
157dependencies = [
158+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
159+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
186− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
160+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
187]
161]
188
162
189[[package]]
163[[package]]
190name = "csv"
164name = "csv"
191−version = "1.0.5"
165+version = "1.1.1"
192source = "registry+https://github.com/rust-lang/crates.io-index"
166source = "registry+https://github.com/rust-lang/crates.io-index"
193dependencies = [
167dependencies = [
168+ "bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
169+ "csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
170+ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
194− "csv-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
171+ "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
195− "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
172+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
196]
173]
197
174
198[[package]]
175[[package]]
199name = "csv-core"
176name = "csv-core"
200−version = "0.1.5"
177+version = "0.1.6"
201source = "registry+https://github.com/rust-lang/crates.io-index"
178source = "registry+https://github.com/rust-lang/crates.io-index"
202dependencies = [
179dependencies = [
203− "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
180+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
204]
181]
205
182
206[[package]]
183[[package]]
207name = "dodrio"
184name = "dodrio"
208−version = "0.1.0"
185+version = "0.2.0"
209dependencies = [
186dependencies = [
210− "bumpalo 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
187+ "bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
211− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
188+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
212− "console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
189+ "console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
213− "criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
190+ "criterion 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
214− "dodrio-js-api 0.1.0",
191+ "dodrio-js-api 0.2.0",
215− "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
192+ "futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
216 "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
193 "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
217− "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
194+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
218− "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
195+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
219 "longest-increasing-subsequence 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
196 "longest-increasing-subsequence 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
220− "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
197+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
221− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
198+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
222− "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
199+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
223− "wasm-bindgen-test 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
200+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
224− "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
201+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
225]
202]
226
203
227[[package]]
204[[package]]
@@ -229,12 +206,12 @@ name = "dodrio-counter"
229version = "0.1.0"
206version = "0.1.0"
230dependencies = [
207dependencies = [
231 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
208 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
232− "console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
209+ "console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
233− "dodrio 0.1.0",
210+ "dodrio 0.2.0",
234− "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
211+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
235− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
212+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
236− "wasm-bindgen-test 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
213+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
237− "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
214+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
238]
215]
239
216
240[[package]]
217[[package]]
@@ -242,13 +219,12 @@ name = "dodrio-game-of-life"
242version = "0.1.0"
219version = "0.1.0"
243dependencies = [
220dependencies = [
244 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
221 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
245− "dodrio 0.1.0",
222+ "dodrio 0.2.0",
246− "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
247− "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
223+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
248− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
224+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
249− "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
225+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
250− "wasm-bindgen-test 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
226+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
251− "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
227+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
252]
228]
253
229
254[[package]]
230[[package]]
@@ -256,10 +232,10 @@ name = "dodrio-hello-world"
256version = "0.1.0"
232version = "0.1.0"
257dependencies = [
233dependencies = [
258 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
234 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
259− "dodrio 0.1.0",
235+ "dodrio 0.2.0",
260− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
236+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
261− "wasm-bindgen-test 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
237+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
262− "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
238+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
263]
239]
264
240
265[[package]]
241[[package]]
@@ -267,22 +243,21 @@ name = "dodrio-input-form"
267version = "0.1.0"
243version = "0.1.0"
268dependencies = [
244dependencies = [
269 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
245 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
270− "dodrio 0.1.0",
246+ "dodrio 0.2.0",
271− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
247+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
272− "wasm-bindgen-test 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
248+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
273− "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
249+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
274]
250]
275
251
276[[package]]
252[[package]]
277name = "dodrio-js-api"
253name = "dodrio-js-api"
278−version = "0.1.0"
254+version = "0.2.0"
279dependencies = [
255dependencies = [
280− "dodrio 0.1.0",
256+ "dodrio 0.2.0",
281− "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
282− "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
257+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
283− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
258+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
284− "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
259+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
285− "wasm-bindgen-test 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
260+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
286]
261]
287
262
288[[package]]
263[[package]]
@@ -290,28 +265,27 @@ name = "dodrio-js-component"
290version = "0.1.0"
265version = "0.1.0"
291dependencies = [
266dependencies = [
292 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
267 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
293− "dodrio 0.1.0",
268+ "dodrio 0.2.0",
294− "dodrio-js-api 0.1.0",
269+ "dodrio-js-api 0.2.0",
295− "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
270+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
296− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
271+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
297− "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
272+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
298]
273]
299
274
300[[package]]
275[[package]]
301name = "dodrio-moire"
276name = "dodrio-moire"
302version = "0.1.0"
277version = "0.1.0"
303dependencies = [
278dependencies = [
304− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
279+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
305 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
280 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
306− "console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
281+ "console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
307− "dodrio 0.1.0",
282+ "dodrio 0.2.0",
308− "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
309− "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
283+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
310− "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
284+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
311− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
285+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
312− "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
286+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
313− "wasm-bindgen-test 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
287+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
314− "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
288+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
315]
289]
316
290
317[[package]]
291[[package]]
@@ -319,142 +293,189 @@ name = "dodrio-sierpinski"
319version = "0.1.0"
293version = "0.1.0"
320dependencies = [
294dependencies = [
321 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
295 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
322− "dodrio 0.1.0",
296+ "dodrio 0.2.0",
323− "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
324− "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
297+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
325− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
298+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
326− "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
299+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
327− "wasm-bindgen-test 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
300+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
328− "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
301+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
329]
302]
330
303
331[[package]]
304[[package]]
332name = "dodrio-todomvc"
305name = "dodrio-todomvc"
333version = "0.1.0"
306version = "0.1.0"
334dependencies = [
307dependencies = [
335− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
308+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
336 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
309 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
337− "console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
310+ "console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
338− "dodrio 0.1.0",
311+ "dodrio 0.2.0",
339− "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
340− "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
312+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
341− "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
313+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
342− "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
314+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
343− "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
315+ "serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)",
344− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
316+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
345− "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
317+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
346− "wasm-bindgen-test 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
318+ "wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
347− "web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
319+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
348]
320]
349
321
350[[package]]
322[[package]]
351name = "either"
323name = "either"
352−version = "1.5.2"
324+version = "1.5.3"
353source = "registry+https://github.com/rust-lang/crates.io-index"
325source = "registry+https://github.com/rust-lang/crates.io-index"
354
326
355[[package]]
327[[package]]
356−name = "env_logger"
328+name = "futures"
357−version = "0.6.1"
329+version = "0.3.5"
358source = "registry+https://github.com/rust-lang/crates.io-index"
330source = "registry+https://github.com/rust-lang/crates.io-index"
359dependencies = [
331dependencies = [
360− "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
332+ "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
333+ "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
361− "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
334+ "futures-executor 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
362− "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
335+ "futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
363− "regex 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
336+ "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
337+ "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
364− "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
338+ "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
365]
339]
366
340
367[[package]]
341[[package]]
368−name = "failure"
342+name = "futures-channel"
369−version = "0.1.5"
343+version = "0.3.5"
370source = "registry+https://github.com/rust-lang/crates.io-index"
344source = "registry+https://github.com/rust-lang/crates.io-index"
371dependencies = [
345dependencies = [
372− "backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
346+ "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
373− "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
347+ "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
374]
348]
375
349
376[[package]]
350[[package]]
377−name = "failure_derive"
351+name = "futures-core"
378−version = "0.1.5"
352+version = "0.3.5"
353+source = "registry+https://github.com/rust-lang/crates.io-index"
354+
355+[[package]]
356+name = "futures-executor"
357+version = "0.3.5"
379source = "registry+https://github.com/rust-lang/crates.io-index"
358source = "registry+https://github.com/rust-lang/crates.io-index"
380dependencies = [
359dependencies = [
381− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
360+ "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
382− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
361+ "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
383− "syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)",
384− "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
362+ "futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
385]
363]
386
364
387[[package]]
365[[package]]
388−name = "fuchsia-cprng"
366+name = "futures-io"
389−version = "0.1.1"
367+version = "0.3.5"
390source = "registry+https://github.com/rust-lang/crates.io-index"
368source = "registry+https://github.com/rust-lang/crates.io-index"
391
369
392[[package]]
370[[package]]
393−name = "futures"
371+name = "futures-macro"
394−version = "0.1.28"
372+version = "0.3.5"
373+source = "registry+https://github.com/rust-lang/crates.io-index"
374+dependencies = [
375+ "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)",
376+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
377+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
378+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
379+]
380+
381+[[package]]
382+name = "futures-sink"
383+version = "0.3.5"
384+source = "registry+https://github.com/rust-lang/crates.io-index"
385+
386+[[package]]
387+name = "futures-task"
388+version = "0.3.5"
395source = "registry+https://github.com/rust-lang/crates.io-index"
389source = "registry+https://github.com/rust-lang/crates.io-index"
390+dependencies = [
391+ "once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
392+]
393+
394+[[package]]
395+name = "futures-util"
396+version = "0.3.5"
397+source = "registry+https://github.com/rust-lang/crates.io-index"
398+dependencies = [
399+ "futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
400+ "futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
401+ "futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
402+ "futures-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
403+ "futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
404+ "futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
405+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
406+ "pin-project 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)",
407+ "pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
408+ "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)",
409+ "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
410+ "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
411+]
396
412
397[[package]]
413[[package]]
398name = "fxhash"
414name = "fxhash"
399version = "0.2.1"
415version = "0.2.1"
400source = "registry+https://github.com/rust-lang/crates.io-index"
416source = "registry+https://github.com/rust-lang/crates.io-index"
401dependencies = [
417dependencies = [
402− "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
418+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
403]
419]
404
420
421+[[package]]
422+name = "half"
423+version = "1.6.0"
424+source = "registry+https://github.com/rust-lang/crates.io-index"
425+
405[[package]]
426[[package]]
406name = "heck"
427name = "heck"
407version = "0.3.1"
428version = "0.3.1"
408source = "registry+https://github.com/rust-lang/crates.io-index"
429source = "registry+https://github.com/rust-lang/crates.io-index"
409dependencies = [
430dependencies = [
410− "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
431+ "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
411]
432]
412
433
413[[package]]
434[[package]]
414−name = "humantime"
435+name = "hermit-abi"
415−version = "1.2.0"
436+version = "0.1.3"
416source = "registry+https://github.com/rust-lang/crates.io-index"
437source = "registry+https://github.com/rust-lang/crates.io-index"
417dependencies = [
438dependencies = [
418− "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
439+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
419]
440]
420
441
421[[package]]
442[[package]]
422name = "itertools"
443name = "itertools"
423−version = "0.8.0"
444+version = "0.9.0"
424source = "registry+https://github.com/rust-lang/crates.io-index"
445source = "registry+https://github.com/rust-lang/crates.io-index"
425dependencies = [
446dependencies = [
426− "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
447+ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
427]
448]
428
449
429[[package]]
450[[package]]
430name = "itoa"
451name = "itoa"
431−version = "0.4.3"
452+version = "0.4.4"
432source = "registry+https://github.com/rust-lang/crates.io-index"
453source = "registry+https://github.com/rust-lang/crates.io-index"
433
454
434[[package]]
455[[package]]
435name = "js-sys"
456name = "js-sys"
436−version = "0.3.19"
457+version = "0.3.32"
437source = "registry+https://github.com/rust-lang/crates.io-index"
458source = "registry+https://github.com/rust-lang/crates.io-index"
438dependencies = [
459dependencies = [
439− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
460+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
440]
461]
441
462
442[[package]]
463[[package]]
443name = "lazy_static"
464name = "lazy_static"
444−version = "1.3.0"
465+version = "1.4.0"
445source = "registry+https://github.com/rust-lang/crates.io-index"
466source = "registry+https://github.com/rust-lang/crates.io-index"
446
467
447[[package]]
468[[package]]
448name = "libc"
469name = "libc"
449−version = "0.2.51"
470+version = "0.2.66"
450source = "registry+https://github.com/rust-lang/crates.io-index"
471source = "registry+https://github.com/rust-lang/crates.io-index"
451
472
452[[package]]
473[[package]]
453name = "log"
474name = "log"
454−version = "0.4.8"
475+version = "0.4.11"
455source = "registry+https://github.com/rust-lang/crates.io-index"
476source = "registry+https://github.com/rust-lang/crates.io-index"
456dependencies = [
477dependencies = [
457− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
478+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
458]
479]
459
480
460[[package]]
481[[package]]
@@ -464,175 +485,180 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
464
485
465[[package]]
486[[package]]
466name = "memchr"
487name = "memchr"
467−version = "2.2.0"
488+version = "2.2.1"
468source = "registry+https://github.com/rust-lang/crates.io-index"
489source = "registry+https://github.com/rust-lang/crates.io-index"
469dependencies = [
490dependencies = [
470− "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
491+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
471]
492]
472
493
473[[package]]
494[[package]]
474name = "memoffset"
495name = "memoffset"
475−version = "0.2.1"
496+version = "0.5.3"
476−source = "registry+https://github.com/rust-lang/crates.io-index"
477−
478−[[package]]
479−name = "nodrop"
480−version = "0.1.13"
481source = "registry+https://github.com/rust-lang/crates.io-index"
497source = "registry+https://github.com/rust-lang/crates.io-index"
498+dependencies = [
499+ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
500+]
482
501
483[[package]]
502[[package]]
484name = "nom"
503name = "nom"
485version = "4.2.3"
504version = "4.2.3"
486source = "registry+https://github.com/rust-lang/crates.io-index"
505source = "registry+https://github.com/rust-lang/crates.io-index"
487dependencies = [
506dependencies = [
488− "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
507+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
489 "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
508 "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
490]
509]
491
510
492[[package]]
511[[package]]
493name = "num-traits"
512name = "num-traits"
494−version = "0.2.6"
513+version = "0.2.10"
495source = "registry+https://github.com/rust-lang/crates.io-index"
514source = "registry+https://github.com/rust-lang/crates.io-index"
515+dependencies = [
516+ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
517+]
496
518
497[[package]]
519[[package]]
498name = "num_cpus"
520name = "num_cpus"
499−version = "1.10.0"
521+version = "1.11.1"
500source = "registry+https://github.com/rust-lang/crates.io-index"
522source = "registry+https://github.com/rust-lang/crates.io-index"
501dependencies = [
523dependencies = [
524+ "hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
502− "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
525+ "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)",
503]
526]
504
527
505[[package]]
528[[package]]
506−name = "proc-macro2"
529+name = "once_cell"
507−version = "0.4.27"
530+version = "1.3.1"
508source = "registry+https://github.com/rust-lang/crates.io-index"
531source = "registry+https://github.com/rust-lang/crates.io-index"
509−dependencies = [
510− "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
511−]
512
532
513[[package]]
533[[package]]
514−name = "quick-error"
534+name = "oorandom"
515−version = "1.2.2"
535+version = "11.1.0"
516source = "registry+https://github.com/rust-lang/crates.io-index"
536source = "registry+https://github.com/rust-lang/crates.io-index"
517
537
518[[package]]
538[[package]]
519−name = "quote"
539+name = "pin-project"
520−version = "0.6.11"
540+version = "0.4.16"
521source = "registry+https://github.com/rust-lang/crates.io-index"
541source = "registry+https://github.com/rust-lang/crates.io-index"
522dependencies = [
542dependencies = [
523− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
543+ "pin-project-internal 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)",
524]
544]
525
545
526[[package]]
546[[package]]
527−name = "rand_core"
547+name = "pin-project-internal"
528−version = "0.3.1"
548+version = "0.4.16"
529source = "registry+https://github.com/rust-lang/crates.io-index"
549source = "registry+https://github.com/rust-lang/crates.io-index"
530dependencies = [
550dependencies = [
551+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
552+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
531− "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
553+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
532]
554]
533
555
534[[package]]
556[[package]]
535−name = "rand_core"
557+name = "pin-utils"
536−version = "0.4.0"
558+version = "0.1.0"
537source = "registry+https://github.com/rust-lang/crates.io-index"
559source = "registry+https://github.com/rust-lang/crates.io-index"
538
560
539[[package]]
561[[package]]
540−name = "rand_os"
562+name = "plotters"
541−version = "0.1.3"
563+version = "0.2.12"
542source = "registry+https://github.com/rust-lang/crates.io-index"
564source = "registry+https://github.com/rust-lang/crates.io-index"
543dependencies = [
565dependencies = [
544− "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
566+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
545− "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
567+ "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
546− "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
568+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
547− "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
548− "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
549− "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
569+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
550]
570]
551
571
552[[package]]
572[[package]]
553−name = "rand_xoshiro"
573+name = "proc-macro-hack"
554−version = "0.1.0"
574+version = "0.5.11"
555source = "registry+https://github.com/rust-lang/crates.io-index"
575source = "registry+https://github.com/rust-lang/crates.io-index"
556dependencies = [
576dependencies = [
557− "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
577+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
578+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
558− "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
579+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
559]
580]
560
581
561[[package]]
582[[package]]
562−name = "rayon"
583+name = "proc-macro-nested"
563−version = "1.0.3"
584+version = "0.1.3"
564source = "registry+https://github.com/rust-lang/crates.io-index"
585source = "registry+https://github.com/rust-lang/crates.io-index"
565−dependencies = [
566− "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
567− "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
568− "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
569−]
570
586
571[[package]]
587[[package]]
572−name = "rayon-core"
588+name = "proc-macro2"
573−version = "1.4.1"
589+version = "1.0.18"
574source = "registry+https://github.com/rust-lang/crates.io-index"
590source = "registry+https://github.com/rust-lang/crates.io-index"
575dependencies = [
591dependencies = [
576− "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
577− "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
578− "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
579− "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
592+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
580]
593]
581
594
582[[package]]
595[[package]]
583−name = "rdrand"
596+name = "quote"
584−version = "0.4.0"
597+version = "1.0.2"
585source = "registry+https://github.com/rust-lang/crates.io-index"
598source = "registry+https://github.com/rust-lang/crates.io-index"
586dependencies = [
599dependencies = [
587− "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
600+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
588]
601]
589
602
590[[package]]
603[[package]]
591−name = "redox_syscall"
604+name = "rayon"
592−version = "0.1.52"
605+version = "1.3.0"
593source = "registry+https://github.com/rust-lang/crates.io-index"
606source = "registry+https://github.com/rust-lang/crates.io-index"
607+dependencies = [
608+ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
609+ "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
610+ "rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
611+]
594
612
595[[package]]
613[[package]]
596−name = "redox_termios"
614+name = "rayon-core"
597−version = "0.1.1"
615+version = "1.7.0"
598source = "registry+https://github.com/rust-lang/crates.io-index"
616source = "registry+https://github.com/rust-lang/crates.io-index"
599dependencies = [
617dependencies = [
618+ "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
619+ "crossbeam-queue 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
620+ "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
621+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
600− "redox_syscall 0.1.52 (registry+https://github.com/rust-lang/crates.io-index)",
622+ "num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
601]
623]
602
624
603[[package]]
625[[package]]
604name = "regex"
626name = "regex"
605−version = "1.1.5"
627+version = "1.3.3"
606source = "registry+https://github.com/rust-lang/crates.io-index"
628source = "registry+https://github.com/rust-lang/crates.io-index"
607dependencies = [
629dependencies = [
608− "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
609− "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
610− "regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
611− "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
612− "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
630+ "regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
613]
631]
614
632
615[[package]]
633[[package]]
616−name = "regex-syntax"
634+name = "regex-automata"
617−version = "0.6.6"
635+version = "0.1.8"
618source = "registry+https://github.com/rust-lang/crates.io-index"
636source = "registry+https://github.com/rust-lang/crates.io-index"
619dependencies = [
637dependencies = [
620− "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
638+ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
621]
639]
622
640
623[[package]]
641[[package]]
624−name = "rustc-demangle"
642+name = "regex-syntax"
625−version = "0.1.13"
643+version = "0.6.13"
626source = "registry+https://github.com/rust-lang/crates.io-index"
644source = "registry+https://github.com/rust-lang/crates.io-index"
627
645
646+[[package]]
647+name = "rustc_version"
648+version = "0.2.3"
649+source = "registry+https://github.com/rust-lang/crates.io-index"
650+dependencies = [
651+ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
652+]
653+
628[[package]]
654[[package]]
629name = "ryu"
655name = "ryu"
630−version = "1.0.0"
656+version = "1.0.2"
631source = "registry+https://github.com/rust-lang/crates.io-index"
657source = "registry+https://github.com/rust-lang/crates.io-index"
632
658
633[[package]]
659[[package]]
634name = "same-file"
660name = "same-file"
635−version = "1.0.4"
661+version = "1.0.5"
636source = "registry+https://github.com/rust-lang/crates.io-index"
662source = "registry+https://github.com/rust-lang/crates.io-index"
637dependencies = [
663dependencies = [
638 "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
664 "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -645,129 +671,109 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
645
671
646[[package]]
672[[package]]
647name = "scopeguard"
673name = "scopeguard"
648−version = "0.3.3"
674+version = "1.0.0"
649source = "registry+https://github.com/rust-lang/crates.io-index"
675source = "registry+https://github.com/rust-lang/crates.io-index"
650
676
651[[package]]
677[[package]]
652−name = "serde"
678+name = "semver"
653−version = "1.0.98"
679+version = "0.9.0"
654source = "registry+https://github.com/rust-lang/crates.io-index"
680source = "registry+https://github.com/rust-lang/crates.io-index"
655dependencies = [
681dependencies = [
656− "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)",
682+ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
657]
683]
658
684
659[[package]]
685[[package]]
660−name = "serde_derive"
686+name = "semver-parser"
661−version = "1.0.90"
687+version = "0.7.0"
662source = "registry+https://github.com/rust-lang/crates.io-index"
688source = "registry+https://github.com/rust-lang/crates.io-index"
663−dependencies = [
664− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
665− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
666− "syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)",
667−]
668
689
669[[package]]
690[[package]]
670−name = "serde_json"
691+name = "serde"
671−version = "1.0.40"
692+version = "1.0.114"
672source = "registry+https://github.com/rust-lang/crates.io-index"
693source = "registry+https://github.com/rust-lang/crates.io-index"
673dependencies = [
694dependencies = [
674− "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
675− "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
676− "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
695+ "serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
677]
696]
678
697
679[[package]]
698[[package]]
680−name = "sourcefile"
699+name = "serde_cbor"
681−version = "0.1.4"
700+version = "0.11.1"
682source = "registry+https://github.com/rust-lang/crates.io-index"
701source = "registry+https://github.com/rust-lang/crates.io-index"
702+dependencies = [
703+ "half 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
704+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
705+]
683
706
684[[package]]
707[[package]]
685−name = "syn"
708+name = "serde_derive"
686−version = "0.15.30"
709+version = "1.0.114"
687source = "registry+https://github.com/rust-lang/crates.io-index"
710source = "registry+https://github.com/rust-lang/crates.io-index"
688dependencies = [
711dependencies = [
689− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
712+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
690− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
713+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
691− "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
714+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
692]
715]
693
716
694[[package]]
717[[package]]
695−name = "synstructure"
718+name = "serde_json"
696−version = "0.10.1"
719+version = "1.0.57"
697source = "registry+https://github.com/rust-lang/crates.io-index"
720source = "registry+https://github.com/rust-lang/crates.io-index"
698dependencies = [
721dependencies = [
699− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
722+ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
700− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
701− "syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)",
723+ "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
702− "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
724+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
703]
725]
704
726
705[[package]]
727[[package]]
706−name = "termcolor"
728+name = "slab"
707−version = "1.0.4"
729+version = "0.4.2"
708source = "registry+https://github.com/rust-lang/crates.io-index"
730source = "registry+https://github.com/rust-lang/crates.io-index"
709−dependencies = [
710− "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
711−]
712
731
713[[package]]
732[[package]]
714−name = "termion"
733+name = "sourcefile"
715−version = "1.5.1"
734+version = "0.1.4"
716source = "registry+https://github.com/rust-lang/crates.io-index"
735source = "registry+https://github.com/rust-lang/crates.io-index"
717−dependencies = [
718− "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
719− "redox_syscall 0.1.52 (registry+https://github.com/rust-lang/crates.io-index)",
720− "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
721−]
722
736
723[[package]]
737[[package]]
724−name = "textwrap"
738+name = "syn"
725−version = "0.10.0"
739+version = "1.0.33"
726source = "registry+https://github.com/rust-lang/crates.io-index"
740source = "registry+https://github.com/rust-lang/crates.io-index"
727dependencies = [
741dependencies = [
742+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
743+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
728− "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
744+ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
729]
745]
730
746
731[[package]]
747[[package]]
732−name = "thread_local"
748+name = "textwrap"
733−version = "0.3.6"
749+version = "0.11.0"
734source = "registry+https://github.com/rust-lang/crates.io-index"
750source = "registry+https://github.com/rust-lang/crates.io-index"
735dependencies = [
751dependencies = [
736− "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
752+ "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
737]
753]
738
754
739[[package]]
755[[package]]
740name = "tinytemplate"
756name = "tinytemplate"
741−version = "1.0.1"
757+version = "1.1.0"
742source = "registry+https://github.com/rust-lang/crates.io-index"
758source = "registry+https://github.com/rust-lang/crates.io-index"
743dependencies = [
759dependencies = [
744− "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)",
760+ "serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)",
745− "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
761+ "serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)",
746]
762]
747
763
748−[[package]]
749−name = "ucd-util"
750−version = "0.1.3"
751−source = "registry+https://github.com/rust-lang/crates.io-index"
752−
753[[package]]
764[[package]]
754name = "unicode-segmentation"
765name = "unicode-segmentation"
755−version = "1.2.1"
766+version = "1.6.0"
756source = "registry+https://github.com/rust-lang/crates.io-index"
767source = "registry+https://github.com/rust-lang/crates.io-index"
757
768
758[[package]]
769[[package]]
759name = "unicode-width"
770name = "unicode-width"
760−version = "0.1.5"
771+version = "0.1.6"
761source = "registry+https://github.com/rust-lang/crates.io-index"
772source = "registry+https://github.com/rust-lang/crates.io-index"
762
773
763[[package]]
774[[package]]
764name = "unicode-xid"
775name = "unicode-xid"
765−version = "0.1.0"
776+version = "0.2.0"
766−source = "registry+https://github.com/rust-lang/crates.io-index"
767−
768−[[package]]
769−name = "utf8-ranges"
770−version = "1.0.2"
771source = "registry+https://github.com/rust-lang/crates.io-index"
777source = "registry+https://github.com/rust-lang/crates.io-index"
772
778
773[[package]]
779[[package]]
@@ -777,126 +783,126 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
777
783
778[[package]]
784[[package]]
779name = "walkdir"
785name = "walkdir"
780−version = "2.2.7"
786+version = "2.3.1"
781source = "registry+https://github.com/rust-lang/crates.io-index"
787source = "registry+https://github.com/rust-lang/crates.io-index"
782dependencies = [
788dependencies = [
783− "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
789+ "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
784− "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
790+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
785 "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
791 "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
786]
792]
787
793
788[[package]]
794[[package]]
789name = "wasm-bindgen"
795name = "wasm-bindgen"
790−version = "0.2.42"
796+version = "0.2.55"
791source = "registry+https://github.com/rust-lang/crates.io-index"
797source = "registry+https://github.com/rust-lang/crates.io-index"
792dependencies = [
798dependencies = [
799+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
793− "wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
800+ "wasm-bindgen-macro 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
794]
801]
795
802
796[[package]]
803[[package]]
797name = "wasm-bindgen-backend"
804name = "wasm-bindgen-backend"
798−version = "0.2.42"
805+version = "0.2.55"
799source = "registry+https://github.com/rust-lang/crates.io-index"
806source = "registry+https://github.com/rust-lang/crates.io-index"
800dependencies = [
807dependencies = [
801− "bumpalo 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
808+ "bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
802− "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
809+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
803− "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
810+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
804− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
811+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
805− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
812+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
806− "syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)",
813+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
807− "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
814+ "wasm-bindgen-shared 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
808]
815]
809
816
810[[package]]
817[[package]]
811name = "wasm-bindgen-futures"
818name = "wasm-bindgen-futures"
812−version = "0.3.19"
819+version = "0.4.5"
813source = "registry+https://github.com/rust-lang/crates.io-index"
820source = "registry+https://github.com/rust-lang/crates.io-index"
814dependencies = [
821dependencies = [
815− "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
822+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
816− "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
823+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
824+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
817− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
825+ "web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
818]
826]
819
827
820[[package]]
828[[package]]
821name = "wasm-bindgen-macro"
829name = "wasm-bindgen-macro"
822−version = "0.2.42"
830+version = "0.2.55"
823source = "registry+https://github.com/rust-lang/crates.io-index"
831source = "registry+https://github.com/rust-lang/crates.io-index"
824dependencies = [
832dependencies = [
825− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
833+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
826− "wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
834+ "wasm-bindgen-macro-support 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
827]
835]
828
836
829[[package]]
837[[package]]
830name = "wasm-bindgen-macro-support"
838name = "wasm-bindgen-macro-support"
831−version = "0.2.42"
839+version = "0.2.55"
832source = "registry+https://github.com/rust-lang/crates.io-index"
840source = "registry+https://github.com/rust-lang/crates.io-index"
833dependencies = [
841dependencies = [
834− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
842+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
835− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
843+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
836− "syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)",
844+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
837− "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
845+ "wasm-bindgen-backend 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
838− "wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
846+ "wasm-bindgen-shared 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
839]
847]
840
848
841[[package]]
849[[package]]
842name = "wasm-bindgen-shared"
850name = "wasm-bindgen-shared"
843−version = "0.2.42"
851+version = "0.2.55"
844source = "registry+https://github.com/rust-lang/crates.io-index"
852source = "registry+https://github.com/rust-lang/crates.io-index"
845
853
846[[package]]
854[[package]]
847name = "wasm-bindgen-test"
855name = "wasm-bindgen-test"
848−version = "0.2.42"
856+version = "0.3.5"
849source = "registry+https://github.com/rust-lang/crates.io-index"
857source = "registry+https://github.com/rust-lang/crates.io-index"
850dependencies = [
858dependencies = [
851 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
859 "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
852− "futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
853− "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
860+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
854 "scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
861 "scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
855− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
862+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
856− "wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
863+ "wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
857− "wasm-bindgen-test-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
864+ "wasm-bindgen-test-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
858]
865]
859
866
860[[package]]
867[[package]]
861name = "wasm-bindgen-test-macro"
868name = "wasm-bindgen-test-macro"
862−version = "0.2.42"
869+version = "0.3.5"
863source = "registry+https://github.com/rust-lang/crates.io-index"
870source = "registry+https://github.com/rust-lang/crates.io-index"
864dependencies = [
871dependencies = [
865− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
872+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
866− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
873+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
867]
874]
868
875
869[[package]]
876[[package]]
870name = "wasm-bindgen-webidl"
877name = "wasm-bindgen-webidl"
871−version = "0.2.42"
878+version = "0.2.55"
872source = "registry+https://github.com/rust-lang/crates.io-index"
879source = "registry+https://github.com/rust-lang/crates.io-index"
873dependencies = [
880dependencies = [
874− "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
881+ "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
875 "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
882 "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
876− "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
883+ "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
877− "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
884+ "proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
878− "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
885+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
879− "syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)",
886+ "syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
880− "wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
887+ "wasm-bindgen-backend 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
881− "weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
888+ "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
882]
889]
883
890
884[[package]]
891[[package]]
885name = "web-sys"
892name = "web-sys"
886−version = "0.3.19"
893+version = "0.3.32"
887source = "registry+https://github.com/rust-lang/crates.io-index"
894source = "registry+https://github.com/rust-lang/crates.io-index"
888dependencies = [
895dependencies = [
889− "env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
890− "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
896+ "anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
891− "js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
897+ "js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)",
892 "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
898 "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
893− "wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
899+ "wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
894− "wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)",
900+ "wasm-bindgen-webidl 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
895]
901]
896
902
897[[package]]
903[[package]]
898name = "weedle"
904name = "weedle"
899−version = "0.8.0"
905+version = "0.10.0"
900source = "registry+https://github.com/rust-lang/crates.io-index"
906source = "registry+https://github.com/rust-lang/crates.io-index"
901dependencies = [
907dependencies = [
902 "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
908 "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -904,7 +910,7 @@ dependencies = [
904
910
905[[package]]
911[[package]]
906name = "winapi"
912name = "winapi"
907−version = "0.3.7"
913+version = "0.3.8"
908source = "registry+https://github.com/rust-lang/crates.io-index"
914source = "registry+https://github.com/rust-lang/crates.io-index"
909dependencies = [
915dependencies = [
910 "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
916 "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -921,7 +927,7 @@ name = "winapi-util"
921version = "0.1.2"
927version = "0.1.2"
922source = "registry+https://github.com/rust-lang/crates.io-index"
928source = "registry+https://github.com/rust-lang/crates.io-index"
923dependencies = [
929dependencies = [
924− "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
930+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
925]
931]
926
932
927[[package]]
933[[package]]
@@ -929,111 +935,101 @@ name = "winapi-x86_64-pc-windows-gnu"
929version = "0.4.0"
935version = "0.4.0"
930source = "registry+https://github.com/rust-lang/crates.io-index"
936source = "registry+https://github.com/rust-lang/crates.io-index"
931
937
932−[[package]]
933−name = "wincolor"
934−version = "1.0.1"
935−source = "registry+https://github.com/rust-lang/crates.io-index"
936−dependencies = [
937− "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
938− "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
939−]
940−
941[metadata]
938[metadata]
942−"checksum aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c"
939+"checksum anyhow 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "9267dff192e68f3399525901e709a48c1d3982c9c072fa32f2127a0cb0babf14"
943−"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71"
944−"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
940+"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90"
945−"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799"
941+"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
946−"checksum backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f106c02a3604afcdc0df5d36cc47b44b55917dbaf3d808f71c163a0ddba64637"
942+"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
947−"checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6"
943+"checksum bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8d6c2c5b58ab920a4f5aeaaca34b4488074e8cc7596af94e6f8c6ff247c60245"
948−"checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd"
949−"checksum bumpalo 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2cd43d82f27d68911e6ee11ee791fb248f138f5d69424dc02e098d4f152b0b05"
944+"checksum bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad807f2fc2bf185eeb98ff3a901bd46dc5ad58163d0fa4577ba0d25674d71708"
950−"checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb"
945+"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
951−"checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427"
946+"checksum cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0"
952−"checksum cc 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)" = "30f813bf45048a18eda9190fd3c6b78644146056740c43172a5a3699118588fd"
953−"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33"
947+"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
954−"checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e"
948+"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
955−"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
956"checksum console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211"
949"checksum console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211"
957−"checksum console_log 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1e7871d2947441b0fdd8e2bd1ce2a2f75304f896582c0d572162d48290683c48"
950+"checksum console_log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "501a375961cef1a0d44767200e66e4a559283097e91d0730b1d75dfb2f8a1494"
958−"checksum criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0363053954f3e679645fc443321ca128b7b950a6fe288cf5f9335cc22ee58394"
951+"checksum criterion 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "70daa7ceec6cf143990669a04c7df13391d55fb27bd4079d252fca774ba244d8"
959−"checksum criterion-plot 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e"
952+"checksum criterion-plot 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e022feadec601fba1649cfa83586381a4ad31c6bf3a9ab7d408118b05dd9889d"
960−"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3"
953+"checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca"
961−"checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150"
954+"checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac"
955+"checksum crossbeam-queue 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dfd6515864a82d2f877b42813d4553292c6659498c9a2aa31bab5a15243c2700"
962−"checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9"
956+"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4"
963−"checksum csv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd1c44c58078cfbeaf11fbb3eac9ae5534c23004ed770cc4bfb48e658ae4f04"
957+"checksum csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "37519ccdfd73a75821cac9319d4fce15a81b9fcf75f951df5b9988aa3a0af87d"
964−"checksum csv-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5cdef62f37e6ffe7d1f07a381bc0db32b7a3ff1cac0de56cb0d81e71f53d65"
958+"checksum csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9b5cadb6b25c77aeff80ba701712494213f4a8418fcda2ee11b6560c3ad0bf4c"
965−"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b"
959+"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
966−"checksum env_logger 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b61fa891024a945da30a9581546e8cfaf5602c7b3f4c137a2805cf388f92075a"
960+"checksum futures 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613"
961+"checksum futures-channel 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5"
962+"checksum futures-core 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399"
967−"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
963+"checksum futures-executor 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314"
968−"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1"
964+"checksum futures-io 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789"
969−"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
965+"checksum futures-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39"
970−"checksum futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "45dc39533a6cae6da2b56da48edae506bb767ec07370f86f70fc062e9d435869"
966+"checksum futures-sink 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc"
967+"checksum futures-task 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626"
968+"checksum futures-util 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6"
971"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
969"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
970+"checksum half 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177"
972"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
971"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
973−"checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114"
972+"checksum hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120"
974−"checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358"
973+"checksum itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
975−"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b"
974+"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
976−"checksum js-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "3c994fd445b81741d77f6bcd227d6ed645b95b35a2ecfd2050767450ff1c0b6d"
975+"checksum js-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "1c840fdb2167497b0bd0db43d6dfe61e91637fa72f9d061f8bd17ddc44ba6414"
977−"checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14"
976+"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
978−"checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917"
977+"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"
979−"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
978+"checksum log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
980"checksum longest-increasing-subsequence 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86"
979"checksum longest-increasing-subsequence 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86"
981−"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39"
980+"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
982−"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3"
981+"checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9"
983−"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945"
984"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
982"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
985−"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1"
983+"checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4"
986−"checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba"
984+"checksum num_cpus 1.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76dac5ed2a876980778b8b85f75a71b6cbf0db0b1232ee12f826bccb00d09d72"
987−"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915"
985+"checksum once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b"
988−"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
986+"checksum oorandom 11.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebcec7c9c2a95cacc7cd0ecb89d8a8454eca13906f6deb55258ffff0adeb9405"
989−"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1"
987+"checksum pin-project 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)" = "81d480cb4e89522ccda96d0eed9af94180b7a5f93fb28f66e1fd7d68431663d1"
990−"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
988+"checksum pin-project-internal 0.4.16 (registry+https://github.com/rust-lang/crates.io-index)" = "a82996f11efccb19b685b14b5df818de31c1edcee3daa256ab5775dd98e72feb"
991−"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0"
989+"checksum pin-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
992−"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
990+"checksum plotters 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "4e3bb8da247d27ae212529352020f3e5ee16e83c0c258061d27b08ab92675eeb"
993−"checksum rand_xoshiro 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "03b418169fb9c46533f326efd6eed2576699c44ca92d3052a066214a8d828929"
991+"checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5"
994−"checksum rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "373814f27745b2686b350dd261bfd24576a6fb0e2c5919b3a2b6005f820b0473"
992+"checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e"
995−"checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356"
993+"checksum proc-macro2 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa"
996−"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
994+"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
997−"checksum redox_syscall 0.1.52 (registry+https://github.com/rust-lang/crates.io-index)" = "d32b3053e5ced86e4bc0411fec997389532bf56b000e66cb4884eeeb41413d69"
995+"checksum rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098"
998−"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
996+"checksum rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9"
997+"checksum regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b5508c1941e4e7cb19965abef075d35a9a8b5cdf0846f30b4050e9b55dc55e87"
999−"checksum regex 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "559008764a17de49a3146b234641644ed37d118d1ef641a0bb573d146edc6ce0"
998+"checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9"
1000−"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96"
999+"checksum regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e734e891f5b408a29efbf8309e656876276f49ab6a6ac208600b4419bd893d90"
1001−"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619"
1000+"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
1002−"checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997"
1001+"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8"
1003−"checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267"
1002+"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421"
1004"checksum scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
1003"checksum scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2"
1005−"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27"
1004+"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
1006−"checksum serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)" = "7fe5626ac617da2f2d9c48af5515a21d5a480dbd151e01bb1c355e26a3e68113"
1005+"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
1006+"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
1007+"checksum serde 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)" = "5317f7588f0a5078ee60ef675ef96735a1442132dc645eb1d12c018620ed8cd3"
1008+"checksum serde_cbor 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622"
1007−"checksum serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "58fc82bec244f168b23d1963b45c8bf5726e9a15a9d146a067f9081aeed2de79"
1009+"checksum serde_derive 1.0.114 (registry+https://github.com/rust-lang/crates.io-index)" = "2a0be94b04690fbaed37cddffc5c134bf537c8e3329d53e982fe04c374978f8e"
1008−"checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704"
1010+"checksum serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)" = "164eacbdb13512ec2745fb09d51fd5b22b0d65ed294a1dcf7285a360c80a675c"
1011+"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
1009"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3"
1012"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3"
1010−"checksum syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)" = "66c8865bf5a7cbb662d8b011950060b3c8743dca141b054bf7195b20d314d8e2"
1013+"checksum syn 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)" = "e8d5d96e8cbb005d6959f119f773bfaebb5684296108fb32600c00cde305b2cd"
1011−"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015"
1012−"checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f"
1013−"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
1014−"checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6"
1014+"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
1015−"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
1015+"checksum tinytemplate 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d3dc76004a03cec1c5932bca4cdc2e39aaa798e3f82363dd94f9adf6098c12f"
1016−"checksum tinytemplate 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7655088894274afb52b807bd3c87072daa1fedd155068b8705cabfd628956115"
1017−"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86"
1018−"checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1"
1016+"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0"
1019−"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526"
1017+"checksum unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7007dbd421b92cc6e28410fe7362e2e0a2503394908f417b68ec8d1c364c4e20"
1020−"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
1018+"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
1021−"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737"
1022"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
1019"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
1023−"checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1"
1020+"checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d"
1024−"checksum wasm-bindgen 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ffde3534e5fa6fd936e3260cd62cd644b8656320e369388f9303c955895e35d4"
1021+"checksum wasm-bindgen 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "29ae32af33bacd663a9a28241abecf01f2be64e6a185c6139b04f18b6385c5f2"
1025−"checksum wasm-bindgen-backend 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "40c0543374a7ae881cdc5d32d19de28d1d1929e92263ffa7e31712cc2d53f9f1"
1022+"checksum wasm-bindgen-backend 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "1845584bd3593442dc0de6e6d9f84454a59a057722f36f005e44665d6ab19d85"
1026−"checksum wasm-bindgen-futures 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "0ad171fc1f6e43f97d155d27f4ee5657bd8aa5cce7c497ef3a0a0c5b44618b2d"
1023+"checksum wasm-bindgen-futures 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1458706aa1b8fe6898d19433c9f110d93a05d1f22ae6adf55810409a94df34b4"
1027−"checksum wasm-bindgen-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "f914c94c2c5f4c9364510ca2429e59c92157ec89429243bcc245e983db990a71"
1024+"checksum wasm-bindgen-macro 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "87fcc747e6b73c93d22c947a6334644d22cfec5abd8b66238484dc2b0aeb9fe4"
1028−"checksum wasm-bindgen-macro-support 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9168c413491e4233db7b6884f09a43beb00c14d11d947ffd165242daa48a2385"
1025+"checksum wasm-bindgen-macro-support 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "3dc4b3f2c4078c8c4a5f363b92fcf62604c5913cbd16c6ff5aaf0f74ec03f570"
1029−"checksum wasm-bindgen-shared 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "326c32126e1a157b6ced7400061a84ac5b11182b2cda6edad7314eb3ae9ac9fe"
1026+"checksum wasm-bindgen-shared 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "ca0b78d6d3be8589b95d1d49cdc0794728ca734adf36d7c9f07e6459508bb53d"
1030−"checksum wasm-bindgen-test 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "8aed4ef1aa56f2ef4aff593c516de6a3e48711c703b3f7415c9151a7c9babd17"
1027+"checksum wasm-bindgen-test 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ed5833682054e941db0b7e2b4877b61bbaafd680608e40d268e070d34558b305"
1031−"checksum wasm-bindgen-test-macro 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "eb477c50f3c9a9ecd99c78fb9bd3b6599d414b918d5f72165b12c53738011ae1"
1028+"checksum wasm-bindgen-test-macro 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9c5dcf70d21d0ff0ea5cdb97dba9a9b56ddad4a9bd10c8912eedc55618be022f"
1032−"checksum wasm-bindgen-webidl 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "613dbf4d7d3bf10aeb212b35de14a8ef07222c26526d4f931061a83fc9e2a851"
1029+"checksum wasm-bindgen-webidl 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "3126356474ceb717c8fb5549ae387c9fbf4872818454f4d87708bee997214bb5"
1033−"checksum web-sys 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "24129e4be2281109b3e15a328d3d7f233ee232a5405f75ba1e9bb59a25ebc4d4"
1030+"checksum web-sys 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "98405c0a2e722ed3db341b4c5b70eb9fe0021621f7350bab76df93b09b649bbf"
1034−"checksum weedle 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26a4c67f132386d965390b8a734d5d10adbcd30eb5cc74bd9229af8b83f10044"
1031+"checksum weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164"
1035−"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770"
1032+"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
1036"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1033"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1037"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9"
1034"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9"
1038"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1035"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1039−"checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba"
Cargo.toml+16−16
@@ -8,7 +8,7 @@ license = "MPL-2.0"
8name = "dodrio"
8name = "dodrio"
9readme = "./README.md"
9readme = "./README.md"
10repository = "https://github.com/fitzgen/dodrio"
10repository = "https://github.com/fitzgen/dodrio"
11−version = "0.1.0"
11+version = "0.2.0"
12
12
13[badges]
13[badges]
14travis-ci = { repository = "fitzgen/dodrio" }
14travis-ci = { repository = "fitzgen/dodrio" }
@@ -42,19 +42,18 @@ xxx-unstable-strace = []
42xxx-unstable-internal-use-only = []
42xxx-unstable-internal-use-only = []
43
43
44[dependencies]
44[dependencies]
45−bumpalo = "2.5.0"
45+bumpalo = "2.6.0"
46−cfg-if = "0.1.9"
46+cfg-if = "0.1.10"
47−futures = "0.1.28"
48−wasm-bindgen = "0.2.42"
49−wasm-bindgen-futures = "0.3.19"
50−js-sys = "0.3.19"
51fxhash = "0.2.1"
47fxhash = "0.2.1"
48+js-sys = "0.3.32"
52−log = { version = "0.4.8", optional = true }
49+log = { version = "0.4.11", optional = true }
53longest-increasing-subsequence = "0.1.0"
50longest-increasing-subsequence = "0.1.0"
54−serde = { version = "1.0.98", optional = true }
51+serde = { version = "1.0.114", optional = true }
52+wasm-bindgen = "0.2.55"
53+wasm-bindgen-futures = "0.4.5"
55
54
56[dependencies.web-sys]
55[dependencies.web-sys]
57−version = "0.3.19"
56+version = "0.3.32"
58features = [
57features = [
59 "console",
58 "console",
60 "Document",
59 "Document",
@@ -65,13 +64,14 @@ features = [
65]
64]
66
65
67[dev-dependencies]
66[dev-dependencies]
68−console_log = "0.1.2"
67+console_log = "0.2.0"
69−dodrio-js-api = { version = "=0.1.0", path = "./crates/js-api" }
68+dodrio-js-api = { version = "=0.2.0", path = "./crates/js-api" }
69+futures = "0.3.5"
70−log = "0.4.8"
70+log = "0.4.11"
71−wasm-bindgen-test = "0.2.42"
71+wasm-bindgen-test = "0.3.5"
72
72
73[dev-dependencies.web-sys]
73[dev-dependencies.web-sys]
74−version = "0.3.19"
74+version = "0.3.32"
75features = [
75features = [
76 "Attr",
76 "Attr",
77 "EventTarget",
77 "EventTarget",
@@ -81,7 +81,7 @@ features = [
81]
81]
82
82
83[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies]
83[target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies]
84−criterion = "0.2.11"
84+criterion = "0.3.3"
85
85
86[profile.bench]
86[profile.bench]
87debug = true
87debug = true
benches/benches.rs+9−22
@@ -13,19 +13,20 @@ use dodrio::{
13 CachedSet, Node, Render, RenderContext, Vdom,
13 CachedSet, Node, Render, RenderContext, Vdom,
14};
14};
15use std::cell::RefCell;
15use std::cell::RefCell;
16+use std::convert::TryInto;
16
17
17/// The simplest thing we can render: `<div/>`.
18/// The simplest thing we can render: `<div/>`.
18struct Empty;
19struct Empty;
19−impl Render for Empty {
20+impl<'a> Render<'a> for Empty {
20− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
21+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
21 div(&cx).finish()
22 div(&cx).finish()
22 }
23 }
23}
24}
24
25
25/// Render a list that is `self.0` items long, has attributes and listeners.
26/// Render a list that is `self.0` items long, has attributes and listeners.
26struct SimpleList(usize);
27struct SimpleList(usize);
27−impl Render for SimpleList {
28+impl<'a> Render<'a> for SimpleList {
28− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
29+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
29 let mut children = bumpalo::collections::Vec::with_capacity_in(self.0, cx.bump);
30 let mut children = bumpalo::collections::Vec::with_capacity_in(self.0, cx.bump);
30 children.extend((0..self.0).map(|_| {
31 children.extend((0..self.0).map(|_| {
31 li(&cx)
32 li(&cx)
@@ -73,16 +74,9 @@ fn criterion_benchmark(c: &mut Criterion) {
73 })
74 })
74 }
75 }
75 },
76 },
76− vec![
77− // TODO: Only test one `n` value until
78− // https://github.com/bheisler/criterion.rs/issues/269 is fixed.
79− //
80− // 100,
81− // 1_000,
82− 10_000,
77+ vec![100, 1_000, 10_000],
83− ],
84 )
78 )
85− .throughput(|n| Throughput::Elements(*n as u32)),
79+ .throughput(|n| Throughput::Elements((*n).try_into().unwrap())),
86 );
80 );
87
81
88 c.bench(
82 c.bench(
@@ -96,14 +90,7 @@ fn criterion_benchmark(c: &mut Criterion) {
96 black_box(&vdom);
90 black_box(&vdom);
97 })
91 })
98 },
92 },
99− vec![
100− // TODO: Only test one `n` value until
101− // https://github.com/bheisler/criterion.rs/issues/269 is fixed.
102− //
103− // 100,
104− // 1_000,
105− 10_000,
93+ vec![100, 1_000, 10_000],
106− ],
107 )
94 )
108 .with_function("empty-to-full-list-to-empty", |b, &n| {
95 .with_function("empty-to-full-list-to-empty", |b, &n| {
109 b.iter(|| {
96 b.iter(|| {
@@ -123,7 +110,7 @@ fn criterion_benchmark(c: &mut Criterion) {
123 black_box(&vdom);
110 black_box(&vdom);
124 })
111 })
125 })
112 })
126− .throughput(|n| Throughput::Elements(*n as u32)),
113+ .throughput(|n| Throughput::Elements((*n).try_into().unwrap())),
127 );
114 );
128}
115}
129
116
crates/js-api/Cargo.toml+6−7
@@ -7,17 +7,16 @@ keywords = ["javascript", "js", "vdom", "virtual-dom"]
7license = "MPL-2.0"
7license = "MPL-2.0"
8name = "dodrio-js-api"
8name = "dodrio-js-api"
9repository = "https://github.com/fitzgen/dodrio"
9repository = "https://github.com/fitzgen/dodrio"
10−version = "0.1.0"
10+version = "0.2.0"
11
11
12[badges]
12[badges]
13travis-ci = { repository = "fitzgen/dodrio" }
13travis-ci = { repository = "fitzgen/dodrio" }
14
14
15[dependencies]
15[dependencies]
16−dodrio = { version = "=0.1.0", path = "../.." }
16+dodrio = { version = "=0.2.0", path = "../.." }
17−wasm-bindgen = "0.2.42"
17+wasm-bindgen = "0.2.55"
18−js-sys = "0.3.19"
18+js-sys = "0.3.32"
19−wasm-bindgen-futures = "0.3.19"
19+wasm-bindgen-futures = "0.4.5"
20−futures = "0.1.28"
21
20
22[dev-dependencies]
21[dev-dependencies]
23−wasm-bindgen-test = "0.2.42"
22+wasm-bindgen-test = "0.3.5"
crates/js-api/src/lib.rs+13−10
@@ -99,8 +99,8 @@ impl GreetingViaJs {
99
99
100/// And finally the `Render` implementation! This adds a `<p>` element and some
100/// And finally the `Render` implementation! This adds a `<p>` element and some
101/// text around whatever the inner JS `Greeting` component renders.
101/// text around whatever the inner JS `Greeting` component renders.
102−impl Render for GreetingViaJs {
102+impl<'a> Render<'a> for GreetingViaJs {
103− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
103+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
104 use dodrio::builder::*;
104 use dodrio::builder::*;
105 p(&cx)
105 p(&cx)
106 .children([
106 .children([
@@ -116,7 +116,6 @@ impl Render for GreetingViaJs {
116#![deny(missing_docs, missing_debug_implementations)]
116#![deny(missing_docs, missing_debug_implementations)]
117
117
118use dodrio::{builder, bumpalo, Node, Render, RenderContext};
118use dodrio::{builder, bumpalo, Node, Render, RenderContext};
119−use futures::prelude::*;
120use js_sys::{Object, Promise, Reflect};
119use js_sys::{Object, Promise, Reflect};
121use wasm_bindgen::prelude::*;
120use wasm_bindgen::prelude::*;
122use wasm_bindgen::JsCast;
121use wasm_bindgen::JsCast;
@@ -185,12 +184,16 @@ impl VdomWeak {
185 /// Schedule re-rendering of the virtual DOM. A promise is returned that is
184 /// Schedule re-rendering of the virtual DOM. A promise is returned that is
186 /// resolved after the rendering has happened.
185 /// resolved after the rendering has happened.
187 pub fn render(&self) -> Promise {
186 pub fn render(&self) -> Promise {
188− wasm_bindgen_futures::future_to_promise(
189− self.inner.render().map(|_| JsValue::null()).map_err(|e| {
187+ let future = self.inner.render();
188+
189+ wasm_bindgen_futures::future_to_promise(async move {
190+ if let Err(e) = future.await {
190 let msg = e.to_string();
191 let msg = e.to_string();
191− js_sys::Error::new(&msg).into()
192+ Err(js_sys::Error::new(&msg).into())
192− }),
193+ } else {
194+ Ok(JsValue::null())
195+ }
193− )
196+ })
194 }
197 }
195}
198}
196
199
@@ -213,8 +216,8 @@ impl JsRender {
213 }
216 }
214}
217}
215
218
216−impl Render for JsRender {
219+impl<'a> Render<'a> for JsRender {
217− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
220+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
218 create(cx, self.render())
221 create(cx, self.render())
219 }
222 }
220}
223}
examples/counter/Cargo.toml+5−5
@@ -11,13 +11,13 @@ crate-type = ["cdylib"]
11
11
12[dependencies]
12[dependencies]
13console_error_panic_hook = "0.1.6"
13console_error_panic_hook = "0.1.6"
14−console_log = "0.1.2"
14+console_log = "0.2.0"
15dodrio = { path = "../.." }
15dodrio = { path = "../.." }
16−log = "0.4.8"
16+log = "0.4.11"
17−wasm-bindgen = "0.2.42"
17+wasm-bindgen = "0.2.55"
18
18
19[dependencies.web-sys]
19[dependencies.web-sys]
20−version = "0.3.19"
20+version = "0.3.32"
21features = [
21features = [
22 "console",
22 "console",
23 "Document",
23 "Document",
@@ -30,4 +30,4 @@ features = [
30]
30]
31
31
32[dev-dependencies]
32[dev-dependencies]
33−wasm-bindgen-test = "0.2.42"
33+wasm-bindgen-test = "0.3.5"
examples/counter/src/lib.rs+2−2
@@ -26,8 +26,8 @@ impl Counter {
26
26
27// The `Render` implementation for `Counter`s displays the current count and has
27// The `Render` implementation for `Counter`s displays the current count and has
28// buttons to increment and decrement the count.
28// buttons to increment and decrement the count.
29−impl Render for Counter {
29+impl<'a> Render<'a> for Counter {
30− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
30+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
31 use dodrio::builder::*;
31 use dodrio::builder::*;
32
32
33 // Stringify the count as a bump-allocated string.
33 // Stringify the count as a bump-allocated string.
examples/game-of-life/Cargo.toml+5−6
@@ -11,14 +11,13 @@ crate-type = ["cdylib"]
11
11
12[dependencies]
12[dependencies]
13dodrio = { path = "../.." }
13dodrio = { path = "../.." }
14−wasm-bindgen = "0.2.42"
14+wasm-bindgen = "0.2.55"
15console_error_panic_hook = "0.1.6"
15console_error_panic_hook = "0.1.6"
16−js-sys = "0.3.19"
16+js-sys = "0.3.32"
17−wasm-bindgen-futures = "0.3.19"
17+wasm-bindgen-futures = "0.4.5"
18−futures = "0.1.28"
19
18
20[dependencies.web-sys]
19[dependencies.web-sys]
21−version = "0.3.19"
20+version = "0.3.32"
22features = [
21features = [
23 "Document",
22 "Document",
24 "HtmlElement",
23 "HtmlElement",
@@ -27,4 +26,4 @@ features = [
27]
26]
28
27
29[dev-dependencies]
28[dev-dependencies]
30−wasm-bindgen-test = "0.2.42"
29+wasm-bindgen-test = "0.3.5"
examples/game-of-life/src/lib.rs+17−12
@@ -1,5 +1,4 @@
1use dodrio::{bumpalo, Node, Render, RenderContext, Vdom};
1use dodrio::{bumpalo, Node, Render, RenderContext, Vdom};
2−use futures::prelude::*;
3use std::cell::RefCell;
2use std::cell::RefCell;
4use std::rc::Rc;
3use std::rc::Rc;
5use wasm_bindgen::{prelude::*, JsCast};
4use wasm_bindgen::{prelude::*, JsCast};
@@ -127,8 +126,8 @@ impl Universe {
127}
126}
128
127
129/// The rendering implementation for our Game of Life.
128/// The rendering implementation for our Game of Life.
130−impl Render for Universe {
129+impl<'a> Render<'a> for Universe {
131− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
130+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
132 use dodrio::builder::*;
131 use dodrio::builder::*;
133
132
134 let mut rows = bumpalo::collections::Vec::with_capacity_in(self.height as usize, cx.bump);
133 let mut rows = bumpalo::collections::Vec::with_capacity_in(self.height as usize, cx.bump);
@@ -178,20 +177,26 @@ pub fn run() {
178
177
179 // Kick off a loop that keeps computing a tick of the universe and then
178 // Kick off a loop that keeps computing a tick of the universe and then
180 // re-rendering on every animation frame.
179 // re-rendering on every animation frame.
181− let rc: Rc<RefCell<Option<Closure<FnMut()>>>> = Rc::new(RefCell::new(None));
180+ let rc = <Rc<RefCell<Option<Closure<dyn FnMut()>>>>>::default();
182 let rc2 = rc.clone();
181 let rc2 = rc.clone();
183 let window2 = window.clone();
182 let window2 = window.clone();
184 let weak = vdom.weak();
183 let weak = vdom.weak();
185 let f = Closure::wrap(Box::new(move || {
184 let f = Closure::wrap(Box::new(move || {
186 weak.schedule_render();
185 weak.schedule_render();
187
186
188− wasm_bindgen_futures::spawn_local(
187+ wasm_bindgen_futures::spawn_local({
188+ let weak = weak.clone();
189+ async move {
189− weak.with_component(|root| {
190+ let fut = weak.with_component(|root| {
190− let universe = root.unwrap_mut::<Universe>();
191+ let universe = root.unwrap_mut::<Universe>();
191− universe.tick();
192+ universe.tick();
192− })
193+ });
194+
195+ if fut.await.is_err() {
193− .map_err(|_| wasm_bindgen::throw_str("impossible, we always keep the vdom alive")),
196+ wasm_bindgen::throw_str("impossible, we always keep the vdom alive");
197+ }
198+ }
194− );
199+ });
195
200
196 window
201 window
197 .request_animation_frame(
202 .request_animation_frame(
@@ -202,7 +207,7 @@ pub fn run() {
202 .unchecked_ref::<js_sys::Function>(),
207 .unchecked_ref::<js_sys::Function>(),
203 )
208 )
204 .unwrap_throw();
209 .unwrap_throw();
205− }) as Box<FnMut()>);
210+ }) as Box<dyn FnMut()>);
206 window2
211 window2
207 .request_animation_frame(f.as_ref().unchecked_ref::<js_sys::Function>())
212 .request_animation_frame(f.as_ref().unchecked_ref::<js_sys::Function>())
208 .unwrap_throw();
213 .unwrap_throw();
examples/hello-world/Cargo.toml+3−3
@@ -11,11 +11,11 @@ crate-type = ["cdylib"]
11
11
12[dependencies]
12[dependencies]
13dodrio = { path = "../.." }
13dodrio = { path = "../.." }
14−wasm-bindgen = "0.2.42"
14+wasm-bindgen = "0.2.55"
15console_error_panic_hook = "0.1.6"
15console_error_panic_hook = "0.1.6"
16
16
17[dependencies.web-sys]
17[dependencies.web-sys]
18−version = "0.3.19"
18+version = "0.3.32"
19features = [
19features = [
20 "Document",
20 "Document",
21 "HtmlElement",
21 "HtmlElement",
@@ -24,4 +24,4 @@ features = [
24]
24]
25
25
26[dev-dependencies]
26[dev-dependencies]
27−wasm-bindgen-test = "0.2.42"
27+wasm-bindgen-test = "0.3.5"
examples/hello-world/src/lib.rs+2−2
@@ -10,8 +10,8 @@ struct Hello {
10
10
11// The `Render` implementation describes how to render a `Hello` component into
11// The `Render` implementation describes how to render a `Hello` component into
12// HTML.
12// HTML.
13−impl Render for Hello {
13+impl<'a> Render<'a> for Hello {
14− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
14+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
15 let msg = bumpalo::format!(in cx.bump, "Hello, {}!", self.who);
15 let msg = bumpalo::format!(in cx.bump, "Hello, {}!", self.who);
16 let msg = msg.into_bump_str();
16 let msg = msg.into_bump_str();
17 p(&cx).children([text(msg)]).finish()
17 p(&cx).children([text(msg)]).finish()
examples/input-form/Cargo.toml+3−3
@@ -11,11 +11,11 @@ crate-type = ["cdylib"]
11
11
12[dependencies]
12[dependencies]
13dodrio = { path = "../.." }
13dodrio = { path = "../.." }
14−wasm-bindgen = "0.2.42"
14+wasm-bindgen = "0.2.55"
15console_error_panic_hook = "0.1.6"
15console_error_panic_hook = "0.1.6"
16
16
17[dependencies.web-sys]
17[dependencies.web-sys]
18−version = "0.3.19"
18+version = "0.3.32"
19features = [
19features = [
20 "console",
20 "console",
21 "Document",
21 "Document",
@@ -29,4 +29,4 @@ features = [
29]
29]
30
30
31[dev-dependencies]
31[dev-dependencies]
32−wasm-bindgen-test = "0.2.42"
32+wasm-bindgen-test = "0.3.5"
examples/input-form/src/lib.rs+2−2
@@ -23,8 +23,8 @@ impl SayHelloTo {
23
23
24// The `Render` implementation has a text `<input>` and a `<div>` that shows a
24// The `Render` implementation has a text `<input>` and a `<div>` that shows a
25// greeting to the `<input>`'s value.
25// greeting to the `<input>`'s value.
26−impl Render for SayHelloTo {
26+impl<'a> Render<'a> for SayHelloTo {
27− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
27+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
28 use dodrio::builder::*;
28 use dodrio::builder::*;
29
29
30 div(&cx)
30 div(&cx)
examples/js-component/Cargo.toml+3−3
@@ -12,12 +12,12 @@ crate-type = ["cdylib"]
12[dependencies]
12[dependencies]
13dodrio = { path = "../.." }
13dodrio = { path = "../.." }
14dodrio-js-api = { path = "../../crates/js-api" }
14dodrio-js-api = { path = "../../crates/js-api" }
15−wasm-bindgen = "0.2.42"
15+wasm-bindgen = "0.2.55"
16console_error_panic_hook = "0.1.6"
16console_error_panic_hook = "0.1.6"
17−js-sys = "0.3.19"
17+js-sys = "0.3.32"
18
18
19[dependencies.web-sys]
19[dependencies.web-sys]
20−version = "0.3.19"
20+version = "0.3.32"
21features = [
21features = [
22 "Document",
22 "Document",
23 "HtmlElement",
23 "HtmlElement",
examples/js-component/src/lib.rs+2−2
@@ -31,8 +31,8 @@ impl GreetingViaJs {
31
31
32/// Here's the `Render` implementation! This adds a `<p>` element and some text
32/// Here's the `Render` implementation! This adds a `<p>` element and some text
33/// around whatever the inner JS `Greeting` component renders.
33/// around whatever the inner JS `Greeting` component renders.
34−impl Render for GreetingViaJs {
34+impl<'a> Render<'a> for GreetingViaJs {
35− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
35+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
36 use dodrio::builder::*;
36 use dodrio::builder::*;
37 p(&cx)
37 p(&cx)
38 .children([text("JavaScript says: "), self.js.render(cx)])
38 .children([text("JavaScript says: "), self.js.render(cx)])
examples/moire/Cargo.toml+8−9
@@ -8,20 +8,19 @@ edition = "2018"
8crate-type = ["cdylib"]
8crate-type = ["cdylib"]
9
9
10[dependencies]
10[dependencies]
11−cfg-if = "0.1.9"
11+cfg-if = "0.1.10"
12dodrio = { path = "../.." }
12dodrio = { path = "../.." }
13−futures = "0.1.28"
14−log = "0.4.8"
13+log = "0.4.11"
15−wasm-bindgen = "0.2.42"
14+wasm-bindgen = "0.2.55"
16−wasm-bindgen-futures = "0.3.19"
15+wasm-bindgen-futures = "0.4.5"
17
16
18# Optional dependencies for logging.
17# Optional dependencies for logging.
19console_error_panic_hook = { optional = true, version = "0.1.6" }
18console_error_panic_hook = { optional = true, version = "0.1.6" }
20−console_log = { optional = true, version = "0.1.2" }
19+console_log = { optional = true, version = "0.2.0" }
21−js-sys = "0.3.19"
20+js-sys = "0.3.32"
22
21
23[dependencies.web-sys]
22[dependencies.web-sys]
24−version = "0.3.19"
23+version = "0.3.32"
25features = [
24features = [
26 "Document",
25 "Document",
27 "Element",
26 "Element",
@@ -35,7 +34,7 @@ features = [
35]
34]
36
35
37[dev-dependencies]
36[dev-dependencies]
38−wasm-bindgen-test = "0.2.42"
37+wasm-bindgen-test = "0.3.5"
39
38
40[features]
39[features]
41logging = [
40logging = [
examples/moire/src/lib.rs+4−4
@@ -27,7 +27,7 @@ pub fn run() {
27 let vdom = Vdom::new(&scene, component);
27 let vdom = Vdom::new(&scene, component);
28
28
29 // Kick off a loop that keeps re-rendering on every animation frame.
29 // Kick off a loop that keeps re-rendering on every animation frame.
30− let rc: Rc<RefCell<Option<Closure<FnMut()>>>> = Rc::new(RefCell::new(None));
30+ let rc = <Rc<RefCell<Option<Closure<dyn FnMut()>>>>>::default();
31 let rc2 = rc.clone();
31 let rc2 = rc.clone();
32 let window2 = window.clone();
32 let window2 = window.clone();
33 let weak = vdom.weak();
33 let weak = vdom.weak();
@@ -42,7 +42,7 @@ pub fn run() {
42 .unchecked_ref::<js_sys::Function>(),
42 .unchecked_ref::<js_sys::Function>(),
43 )
43 )
44 .unwrap_throw();
44 .unwrap_throw();
45− }) as Box<FnMut()>);
45+ }) as Box<dyn FnMut()>);
46 window2
46 window2
47 .request_animation_frame(f.as_ref().unchecked_ref::<js_sys::Function>())
47 .request_animation_frame(f.as_ref().unchecked_ref::<js_sys::Function>())
48 .unwrap_throw();
48 .unwrap_throw();
@@ -104,8 +104,8 @@ impl Moire {
104 }
104 }
105}
105}
106
106
107−impl Render for Moire {
107+impl<'a> Render<'a> for Moire {
108− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
108+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
109 use dodrio::builder::*;
109 use dodrio::builder::*;
110
110
111 let elapsed = web_sys::window()
111 let elapsed = web_sys::window()
examples/sierpinski-triangle/Cargo.toml+5−6
@@ -9,14 +9,13 @@ crate-type = ["cdylib"]
9
9
10[dependencies]
10[dependencies]
11dodrio = { path = "../.." }
11dodrio = { path = "../.." }
12−wasm-bindgen = "0.2.42"
12+wasm-bindgen = "0.2.55"
13console_error_panic_hook = "0.1.6"
13console_error_panic_hook = "0.1.6"
14−js-sys = "0.3.19"
14+js-sys = "0.3.32"
15−wasm-bindgen-futures = "0.3.19"
15+wasm-bindgen-futures = "0.4.5"
16−futures = "0.1.28"
17
16
18[dependencies.web-sys]
17[dependencies.web-sys]
19−version = "0.3.19"
18+version = "0.3.32"
20features = [
19features = [
21 "Document",
20 "Document",
22 "HtmlElement",
21 "HtmlElement",
@@ -26,4 +25,4 @@ features = [
26]
25]
27
26
28[dev-dependencies]
27[dev-dependencies]
29−wasm-bindgen-test = "0.2.42"
28+wasm-bindgen-test = "0.3.5"
examples/sierpinski-triangle/src/lib.rs+4−4
@@ -85,8 +85,8 @@ impl Container {
85 }
85 }
86}
86}
87
87
88−impl Render for Container {
88+impl<'a> Render<'a> for Container {
89− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
89+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
90 use dodrio::builder::div;
90 use dodrio::builder::div;
91
91
92 let elapsed = web_sys::window()
92 let elapsed = web_sys::window()
@@ -111,7 +111,7 @@ impl Render for Container {
111
111
112// Kick off a loop that keeps re-rendering on every animation frame.
112// Kick off a loop that keeps re-rendering on every animation frame.
113fn animate(window: Window, vdom: Vdom) {
113fn animate(window: Window, vdom: Vdom) {
114− let rc: Rc<RefCell<Option<Closure<FnMut()>>>> = Rc::new(RefCell::new(None));
114+ let rc = <Rc<RefCell<Option<Closure<dyn FnMut()>>>>>::default();
115 let rc2 = rc.clone();
115 let rc2 = rc.clone();
116 let window2 = window.clone();
116 let window2 = window.clone();
117 let weak = vdom.weak();
117 let weak = vdom.weak();
@@ -126,7 +126,7 @@ fn animate(window: Window, vdom: Vdom) {
126 .unchecked_ref::<js_sys::Function>(),
126 .unchecked_ref::<js_sys::Function>(),
127 )
127 )
128 .unwrap_throw();
128 .unwrap_throw();
129− }) as Box<FnMut()>);
129+ }) as Box<dyn FnMut()>);
130 window2
130 window2
131 .request_animation_frame(f.as_ref().unchecked_ref::<js_sys::Function>())
131 .request_animation_frame(f.as_ref().unchecked_ref::<js_sys::Function>())
132 .unwrap_throw();
132 .unwrap_throw();
examples/todomvc/Cargo.toml+10−11
@@ -5,22 +5,21 @@ name = "dodrio-todomvc"
5version = "0.1.0"
5version = "0.1.0"
6
6
7[dependencies]
7[dependencies]
8−cfg-if = "0.1.9"
8+cfg-if = "0.1.10"
9dodrio = { path = "../..", features = ["serde"] }
9dodrio = { path = "../..", features = ["serde"] }
10−futures = "0.1.28"
11−js-sys = "0.3.19"
10+js-sys = "0.3.32"
12−serde = { features = ["derive"], version = "1.0.98" }
11+serde = { features = ["derive"], version = "1.0.114" }
13−serde_json = "1.0.40"
12+serde_json = "1.0.57"
14−wasm-bindgen = "0.2.42"
13+wasm-bindgen = "0.2.55"
15−wasm-bindgen-futures = "0.3.19"
14+wasm-bindgen-futures = "0.4.5"
16
15
17# Optional dependencies for logging.
16# Optional dependencies for logging.
18console_error_panic_hook = { optional = true, version = "0.1.6" }
17console_error_panic_hook = { optional = true, version = "0.1.6" }
19−console_log = { optional = true, version = "0.1.2" }
18+console_log = { optional = true, version = "0.2.0" }
20−log = { optional = true, version = "0.4.8" }
19+log = { optional = true, version = "0.4.11" }
21
20
22[dependencies.web-sys]
21[dependencies.web-sys]
23−version = "0.3.19"
22+version = "0.3.32"
24features = [
23features = [
25 "Document",
24 "Document",
26 "Event",
25 "Event",
@@ -35,7 +34,7 @@ features = [
35]
34]
36
35
37[dev-dependencies]
36[dev-dependencies]
38−wasm-bindgen-test = "0.2.42"
37+wasm-bindgen-test = "0.3.5"
39
38
40[features]
39[features]
41logging = [
40logging = [
examples/todomvc/src/router.rs+22−19
@@ -4,7 +4,6 @@ use crate::todos::Todos;
4use crate::utils;
4use crate::utils;
5use crate::visibility::Visibility;
5use crate::visibility::Visibility;
6use dodrio::VdomWeak;
6use dodrio::VdomWeak;
7−use futures::prelude::*;
8use std::str::FromStr;
7use std::str::FromStr;
9use wasm_bindgen::{prelude::*, JsCast};
8use wasm_bindgen::{prelude::*, JsCast};
10
9
@@ -29,23 +28,27 @@ pub fn start(vdom: VdomWeak) {
29 v
28 v
30 });
29 });
31
30
32− wasm_bindgen_futures::spawn_local(
31+ wasm_bindgen_futures::spawn_local({
32+ let vdom = vdom.clone();
33+ async move {
34+ let _ = vdom
33− vdom.with_component({
35+ .with_component({
34− let vdom = vdom.clone();
36+ let vdom = vdom.clone();
35− move |root| {
37+ move |root| {
36− let todos = root.unwrap_mut::<Todos>();
38+ let todos = root.unwrap_mut::<Todos>();
37− // If the todos' visibility already matches the event's
39+ // If the todos' visibility already matches the event's
38− // visibility, then there is nothing to do (ha). If they
40+ // visibility, then there is nothing to do (ha). If they
39− // don't match, then we need to update the todos' visibility
41+ // don't match, then we need to update the todos' visibility
40− // and re-render.
42+ // and re-render.
41− if todos.visibility() != new_vis {
43+ if todos.visibility() != new_vis {
42− todos.set_visibility(new_vis);
44+ todos.set_visibility(new_vis);
43− vdom.schedule_render();
45+ vdom.schedule_render();
44− }
46+ }
45− }
47+ }
46− })
48+ })
47− .map_err(|_| ()),
49+ .await;
50+ }
48− );
51+ });
49 };
52 };
50
53
51 // Call it once to handle the initial `#` fragment.
54 // Call it once to handle the initial `#` fragment.
@@ -56,7 +59,7 @@ pub fn start(vdom: VdomWeak) {
56 // Note that if we ever intended to unmount our todos app, we would want to
59 // Note that if we ever intended to unmount our todos app, we would want to
57 // provide a method for removing this router's event listener and cleaning
60 // provide a method for removing this router's event listener and cleaning
58 // up after ourselves.
61 // up after ourselves.
59− let on_hash_change = Closure::wrap(Box::new(on_hash_change) as Box<FnMut()>);
62+ let on_hash_change = Closure::wrap(Box::new(on_hash_change) as Box<dyn FnMut()>);
60 let window = utils::window();
63 let window = utils::window();
61 window
64 window
62 .add_event_listener_with_callback("hashchange", on_hash_change.as_ref().unchecked_ref())
65 .add_event_listener_with_callback("hashchange", on_hash_change.as_ref().unchecked_ref())
examples/todomvc/src/todo.rs+2−2
@@ -116,8 +116,8 @@ impl<C> Todo<C> {
116 }
116 }
117}
117}
118
118
119−impl<C: TodoActions> Render for Todo<C> {
119+impl<'a, C: TodoActions> Render<'a> for Todo<C> {
120− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
120+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
121 use dodrio::{
121 use dodrio::{
122 builder::*,
122 builder::*,
123 bumpalo::{self, collections::String},
123 bumpalo::{self, collections::String},
examples/todomvc/src/todos.rs+2−2
@@ -289,8 +289,8 @@ impl<C: TodosActions> Todos<C> {
289 }
289 }
290}
290}
291
291
292−impl<C: TodosActions> Render for Todos<C> {
292+impl<'a, C: TodosActions> Render<'a> for Todos<C> {
293− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
293+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
294 use dodrio::builder::*;
294 use dodrio::builder::*;
295
295
296 div(&cx)
296 div(&cx)
src/cached.rs+7−7
@@ -45,8 +45,8 @@ where
45 /// count: u32,
45 /// count: u32,
46 /// }
46 /// }
47 ///
47 ///
48− /// impl Render for Counter {
48+ /// impl<'a> Render<'a> for Counter {
49− /// fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
49+ /// fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
50 /// // ...
50 /// // ...
51 /// # unimplemented!()
51 /// # unimplemented!()
52 /// }
52 /// }
@@ -85,8 +85,8 @@ where
85 /// who: String
85 /// who: String
86 /// }
86 /// }
87 ///
87 ///
88− /// impl Render for Hello {
88+ /// impl<'a> Render<'a> for Hello {
89− /// fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
89+ /// fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
90 /// use dodrio::builder::*;
90 /// use dodrio::builder::*;
91 /// let greeting = bumpalo::format!(in cx.bump, "Hello, {}!", self.who);
91 /// let greeting = bumpalo::format!(in cx.bump, "Hello, {}!", self.who);
92 /// p(&cx)
92 /// p(&cx)
@@ -143,11 +143,11 @@ where
143 }
143 }
144}
144}
145
145
146−impl<R> Render for Cached<R>
146+impl<'a, R> Render<'a> for Cached<R>
147where
147where
148− R: 'static + Default + Render,
148+ R: 'static + Default + for<'b> Render<'b>,
149{
149{
150− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
150+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
151 let template = cx.template::<R>();
151 let template = cx.template::<R>();
152 let cached = match self.cached.get() {
152 let cached = match self.cached.get() {
153 // This does-the-cache-contain-this-id check is necessary because
153 // This does-the-cache-contain-this-id check is necessary because
src/change_list/mod.rs+2−2
@@ -233,9 +233,9 @@ impl ChangeListBuilder<'_> {
233 self.state.emitter.replace_with();
233 self.state.emitter.replace_with();
234 }
234 }
235
235
236− pub fn set_attribute(&mut self, name: &str, value: &str) {
236+ pub fn set_attribute(&mut self, name: &str, value: &str, is_namespaced: bool) {
237 debug_assert!(self.traversal_is_committed());
237 debug_assert!(self.traversal_is_committed());
238− if name == "class" {
238+ if name == "class" && !is_namespaced {
239 let class_id = self.ensure_string(value);
239 let class_id = self.ensure_string(value);
240 debug!("emit: set_class({:?})", value);
240 debug!("emit: set_class({:?})", value);
241 self.state.emitter.set_class(class_id.into());
241 self.state.emitter.set_class(class_id.into());
src/change_list/traversal.rs+1−1
@@ -167,7 +167,7 @@ mod tests {
167
167
168 #[test]
168 #[test]
169 fn test_traversal() {
169 fn test_traversal() {
170− fn t<F>(f: F) -> Box<FnMut(&mut Traversal)>
170+ fn t<F>(f: F) -> Box<dyn FnMut(&mut Traversal)>
171 where
171 where
172 F: 'static + FnMut(&mut Traversal),
172 F: 'static + FnMut(&mut Traversal),
173 {
173 {
src/diff.rs+6−6
@@ -78,7 +78,7 @@ pub(crate) fn diff(
78 return;
78 return;
79 }
79 }
80 diff_listeners(change_list, registry, old_listeners, new_listeners);
80 diff_listeners(change_list, registry, old_listeners, new_listeners);
81− diff_attributes(change_list, old_attributes, new_attributes);
81+ diff_attributes(change_list, old_attributes, new_attributes, new_namespace.is_some());
82 diff_children(
82 diff_children(
83 cached_set,
83 cached_set,
84 change_list,
84 change_list,
@@ -204,26 +204,26 @@ fn diff_listeners(
204// [... node]
204// [... node]
205//
205//
206// The change list stack is left unchanged.
206// The change list stack is left unchanged.
207−fn diff_attributes(change_list: &mut ChangeListBuilder, old: &[Attribute], new: &[Attribute]) {
207+fn diff_attributes(change_list: &mut ChangeListBuilder, old: &[Attribute], new: &[Attribute], is_namespaced: bool) {
208 // Do O(n^2) passes to add/update and remove attributes, since
208 // Do O(n^2) passes to add/update and remove attributes, since
209 // there are almost always very few attributes.
209 // there are almost always very few attributes.
210 'outer: for new_attr in new {
210 'outer: for new_attr in new {
211 if new_attr.is_volatile() {
211 if new_attr.is_volatile() {
212 change_list.commit_traversal();
212 change_list.commit_traversal();
213− change_list.set_attribute(new_attr.name, new_attr.value);
213+ change_list.set_attribute(new_attr.name, new_attr.value, is_namespaced);
214 } else {
214 } else {
215 for old_attr in old {
215 for old_attr in old {
216 if old_attr.name == new_attr.name {
216 if old_attr.name == new_attr.name {
217 if old_attr.value != new_attr.value {
217 if old_attr.value != new_attr.value {
218 change_list.commit_traversal();
218 change_list.commit_traversal();
219− change_list.set_attribute(new_attr.name, new_attr.value);
219+ change_list.set_attribute(new_attr.name, new_attr.value, is_namespaced);
220 }
220 }
221 continue 'outer;
221 continue 'outer;
222 }
222 }
223 }
223 }
224
224
225 change_list.commit_traversal();
225 change_list.commit_traversal();
226− change_list.set_attribute(new_attr.name, new_attr.value);
226+ change_list.set_attribute(new_attr.name, new_attr.value, is_namespaced);
227 }
227 }
228 }
228 }
229
229
@@ -953,7 +953,7 @@ fn create(
953 }
953 }
954
954
955 for attr in attributes {
955 for attr in attributes {
956− change_list.set_attribute(&attr.name, &attr.value);
956+ change_list.set_attribute(&attr.name, &attr.value, namespace.is_some());
957 }
957 }
958
958
959 // Fast path: if there is a single text child, it is faster to
959 // Fast path: if there is a single text child, it is faster to
src/events.rs+2−2
@@ -86,7 +86,7 @@ cfg_if::cfg_if! {
86 callback(component, vdom_weak, event);
86 callback(component, vdom_weak, event);
87 }
87 }
88 }
88 }
89− }) as Box<Fn(web_sys::Event, u32, u32)>);
89+ }) as Box<dyn Fn(web_sys::Event, u32, u32)>);
90
90
91 (registry, closure)
91 (registry, closure)
92 }
92 }
@@ -99,7 +99,7 @@ cfg_if::cfg_if! {
99
99
100 pub(crate) fn remove_subtree(&mut self, node: &Node) {
100 pub(crate) fn remove_subtree(&mut self, node: &Node) {
101 match node.kind {
101 match node.kind {
102− NodeKind::Cached(_) | NodeKind::Text(_) => return,
102+ NodeKind::Cached(_) | NodeKind::Text(_) => {},
103 NodeKind::Element(&ElementNode {listeners, children, ..}) => {
103 NodeKind::Element(&ElementNode {listeners, children, ..}) => {
104 for l in listeners {
104 for l in listeners {
105 self.remove(l);
105 self.remove(l);
src/lib.rs+3−3
@@ -18,8 +18,8 @@
18//! }
18//! }
19//! }
19//! }
20//!
20//!
21−//! impl<'who> Render for Hello<'who> {
21+//! impl<'a, 'who> Render<'a> for Hello<'who> {
22−//! fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
22+//! fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
23//! use dodrio::builder::*;
23//! use dodrio::builder::*;
24//!
24//!
25//! let id = bumpalo::format!(in cx.bump, "hello-{}", self.who);
25//! let id = bumpalo::format!(in cx.bump, "hello-{}", self.who);
@@ -123,7 +123,7 @@ cfg_if::cfg_if! {
123 /// An element node in the physical DOM.
123 /// An element node in the physical DOM.
124 pub type Element = web_sys::Element;
124 pub type Element = web_sys::Element;
125
125
126− pub(crate) type EventsTrampoline = wasm_bindgen::closure::Closure<Fn(web_sys::Event, u32, u32)>;
126+ pub(crate) type EventsTrampoline = wasm_bindgen::closure::Closure<dyn Fn(web_sys::Event, u32, u32)>;
127 }
127 }
128}
128}
129
129
src/render.rs+43−16
@@ -21,8 +21,8 @@ use wasm_bindgen::UnwrapThrowExt;
21///
21///
22/// pub struct MyComponent;
22/// pub struct MyComponent;
23///
23///
24−/// impl Render for MyComponent {
24+/// impl<'a> Render<'a> for MyComponent {
25−/// fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
25+/// fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
26/// use dodrio::builder::*;
26/// use dodrio::builder::*;
27///
27///
28/// p(&cx)
28/// p(&cx)
@@ -35,26 +35,26 @@ use wasm_bindgen::UnwrapThrowExt;
35/// }
35/// }
36/// }
36/// }
37/// ```
37/// ```
38−pub trait Render {
38+pub trait Render<'a> {
39 /// Render `self` as a virtual DOM. Use the given context's `Bump` for
39 /// Render `self` as a virtual DOM. Use the given context's `Bump` for
40 /// temporary allocations.
40 /// temporary allocations.
41− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a>;
41+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a>;
42}
42}
43
43
44−impl<'r, R> Render for &'r R
44+impl<'a, 'r, R> Render<'a> for &'r R
45where
45where
46− R: Render,
46+ R: Render<'a>,
47{
47{
48− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
48+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
49 (**self).render(cx)
49 (**self).render(cx)
50 }
50 }
51}
51}
52
52
53−impl<R> Render for Rc<R>
53+impl<'a, R> Render<'a> for Rc<R>
54where
54where
55− R: Render,
55+ R: Render<'a>,
56{
56{
57− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
57+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
58 (**self).render(cx)
58 (**self).render(cx)
59 }
59 }
60}
60}
@@ -69,24 +69,24 @@ where
69/// You do not need to implement this trait by hand: there is a blanket
69/// You do not need to implement this trait by hand: there is a blanket
70/// implementation for all `Render` types that fulfill the `RootRender`
70/// implementation for all `Render` types that fulfill the `RootRender`
71/// requirements.
71/// requirements.
72−pub trait RootRender: Any + Render {
72+pub trait RootRender: Any + for<'a> Render<'a> {
73 /// Get this `&RootRender` trait object as an `&Any` trait object reference.
73 /// Get this `&RootRender` trait object as an `&Any` trait object reference.
74− fn as_any(&self) -> &Any;
74+ fn as_any(&self) -> &dyn Any;
75
75
76 /// Get this `&mut RootRender` trait object as an `&mut Any` trait object
76 /// Get this `&mut RootRender` trait object as an `&mut Any` trait object
77 /// reference.
77 /// reference.
78− fn as_any_mut(&mut self) -> &mut Any;
78+ fn as_any_mut(&mut self) -> &mut dyn Any;
79}
79}
80
80
81impl<T> RootRender for T
81impl<T> RootRender for T
82where
82where
83− T: Any + Render,
83+ T: Any + for<'a> Render<'a>,
84{
84{
85− fn as_any(&self) -> &Any {
85+ fn as_any(&self) -> &dyn Any {
86 self
86 self
87 }
87 }
88
88
89− fn as_any_mut(&mut self) -> &mut Any {
89+ fn as_any_mut(&mut self) -> &mut dyn Any {
90 self
90 self
91 }
91 }
92}
92}
@@ -138,4 +138,31 @@ mod tests {
138 #[allow(dead_code)]
138 #[allow(dead_code)]
139 fn takes_dyn_render(_: &dyn super::RootRender) {}
139 fn takes_dyn_render(_: &dyn super::RootRender) {}
140 }
140 }
141+
142+ #[test]
143+ fn render_bump_scoped_child() {
144+ use crate::{builder::*, bumpalo::collections::String, Node, Render, RenderContext};
145+
146+ struct Child<'a> {
147+ name: &'a str,
148+ }
149+
150+ impl<'a> Render<'a> for Child<'a> {
151+ fn render(&self, _cx: &mut RenderContext<'a>) -> Node<'a> {
152+ text(self.name)
153+ }
154+ }
155+
156+ struct Parent;
157+
158+ impl<'a> Render<'a> for Parent {
159+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
160+ let child_name = String::from_str_in("child", cx.bump).into_bump_str();
161+
162+ div(&cx)
163+ .children([Child { name: child_name }.render(cx)])
164+ .finish()
165+ }
166+ }
167+ }
141}
168}
src/render_context.rs+1−1
@@ -69,7 +69,7 @@ impl<'a> RenderContext<'a> {
69 /// Get or create the cached template for `Cached<R>`.
69 /// Get or create the cached template for `Cached<R>`.
70 pub(crate) fn template<R>(&mut self) -> Option<CacheId>
70 pub(crate) fn template<R>(&mut self) -> Option<CacheId>
71 where
71 where
72− R: 'static + Default + Render,
72+ R: 'static + Default + for<'b> Render<'b>,
73 {
73 {
74 let template_id = Cached::<R>::template_id();
74 let template_id = Cached::<R>::template_id();
75 if let Some(cache_id) = self.templates.get(&template_id).cloned() {
75 if let Some(cache_id) = self.templates.get(&template_id).cloned() {
src/vdom.rs+82−77
@@ -6,11 +6,11 @@ use crate::events::EventsRegistry;
6use crate::node::{Node, NodeKey};
6use crate::node::{Node, NodeKey};
7use crate::RenderContext;
7use crate::RenderContext;
8use bumpalo::Bump;
8use bumpalo::Bump;
9−use futures::future::Future;
10use fxhash::FxHashMap;
9use fxhash::FxHashMap;
11use std::cell::Cell;
10use std::cell::Cell;
12use std::cell::RefCell;
11use std::cell::RefCell;
13use std::fmt;
12use std::fmt;
13+use std::future::Future;
14use std::mem;
14use std::mem;
15use std::mem::ManuallyDrop;
15use std::mem::ManuallyDrop;
16use std::rc::{Rc, Weak};
16use std::rc::{Rc, Weak};
@@ -55,7 +55,7 @@ pub(crate) struct VdomInnerExclusive {
55 // Always `Some` except just before we drop. Just an option so that
55 // Always `Some` except just before we drop. Just an option so that
56 // `unmount` can take the component out but we can still have a Drop
56 // `unmount` can take the component out but we can still have a Drop
57 // implementation.
57 // implementation.
58− component: Option<Box<RootRender>>,
58+ component: Option<Box<dyn RootRender>>,
59
59
60 dom_buffers: Option<[Bump; 2]>,
60 dom_buffers: Option<[Bump; 2]>,
61 change_list: ManuallyDrop<ChangeListPersistentState>,
61 change_list: ManuallyDrop<ChangeListPersistentState>,
@@ -158,12 +158,15 @@ impl Vdom {
158 where
158 where
159 R: RootRender,
159 R: RootRender,
160 {
160 {
161− Self::with_boxed_root_render(container, Box::new(component) as Box<RootRender>)
161+ Self::with_boxed_root_render(container, Box::new(component) as Box<dyn RootRender>)
162 }
162 }
163
163
164 /// Construct a `Vdom` with the already-boxed-as-a-trait-object root
164 /// Construct a `Vdom` with the already-boxed-as-a-trait-object root
165 /// rendering component.
165 /// rendering component.
166− pub fn with_boxed_root_render(container: &crate::Element, component: Box<RootRender>) -> Vdom {
166+ pub fn with_boxed_root_render(
167+ container: &crate::Element,
168+ component: Box<dyn RootRender>,
169+ ) -> Vdom {
167 crate::strace::init_strace();
170 crate::strace::init_strace();
168
171
169 let dom_buffers = [Bump::new(), Bump::new()];
172 let dom_buffers = [Bump::new(), Bump::new()];
@@ -217,7 +220,7 @@ impl Vdom {
217 R: RootRender,
220 R: RootRender,
218 {
221 {
219 let mut exclusive = self.inner.exclusive.borrow_mut();
222 let mut exclusive = self.inner.exclusive.borrow_mut();
220− let component = Box::new(component) as Box<RootRender>;
223+ let component = Box::new(component) as Box<dyn RootRender>;
221 exclusive.component = Some(component);
224 exclusive.component = Some(component);
222 exclusive.render();
225 exclusive.render();
223 }
226 }
@@ -237,7 +240,7 @@ impl Vdom {
237 /// Unmount this virtual DOM, unregister its event listeners, and return its
240 /// Unmount this virtual DOM, unregister its event listeners, and return its
238 /// root render component.
241 /// root render component.
239 #[inline]
242 #[inline]
240− pub fn unmount(self) -> Box<RootRender> {
243+ pub fn unmount(self) -> Box<dyn RootRender> {
241 Rc::try_unwrap(self.inner.clone())
244 Rc::try_unwrap(self.inner.clone())
242 .map_err(|_| ())
245 .map_err(|_| ())
243 .unwrap_throw()
246 .unwrap_throw()
@@ -323,7 +326,7 @@ impl VdomInnerExclusive {
323 }
326 }
324}
327}
325
328
326−fn request_animation_frame(f: &Closure<FnMut()>) {
329+fn request_animation_frame(f: &Closure<dyn FnMut()>) {
327 web_sys::window()
330 web_sys::window()
328 .expect_throw("should have a window")
331 .expect_throw("should have a window")
329 .request_animation_frame(f.as_ref().unchecked_ref())
332 .request_animation_frame(f.as_ref().unchecked_ref())
@@ -340,7 +343,7 @@ where
340 let f = Closure::wrap(Box::new(move || {
343 let f = Closure::wrap(Box::new(move || {
341 *g.borrow_mut() = None;
344 *g.borrow_mut() = None;
342 f();
345 f();
343− }) as Box<FnMut()>);
346+ }) as Box<dyn FnMut()>);
344 request_animation_frame(&f);
347 request_animation_frame(&f);
345
348
346 *h.borrow_mut() = Some(f);
349 *h.borrow_mut() = Some(f);
@@ -371,25 +374,23 @@ impl VdomWeak {
371 /// Replace the root rendering component with the new `root`.
374 /// Replace the root rendering component with the new `root`.
372 ///
375 ///
373 /// Returns a future that resolves to the *old* root component.
376 /// Returns a future that resolves to the *old* root component.
374− pub fn set_component(
377+ pub async fn set_component(
375 self,
378 self,
376 root: Box<dyn RootRender>,
379 root: Box<dyn RootRender>,
377− ) -> impl Future<Item = Box<dyn RootRender + 'static>, Error = VdomDroppedError> {
380+ ) -> Result<Box<dyn RootRender + 'static>, VdomDroppedError> {
378− futures::future::ok(self.inner.upgrade())
379− .and_then(|inner| inner.ok_or(()))
380− .map_err(|_| VdomDroppedError {})
381+ let inner = self.inner.upgrade().ok_or(VdomDroppedError {})?;
381− .and_then(|inner| {
382+
383+ // Wait for a new tick of the micro-task queue
382− let promise = js_sys::Promise::resolve(&JsValue::null());
384+ let _ = JsFuture::from(js_sys::Promise::resolve(&JsValue::null())).await;
383− JsFuture::from(promise)
385+
384− .map_err(|_| VdomDroppedError {})
385− .and_then(move |_| {
386− let old = {
386+ let old = {
387− let mut exclusive = inner.exclusive.borrow_mut();
387+ let mut exclusive = inner.exclusive.borrow_mut();
388− mem::replace(&mut *exclusive.component.as_mut().unwrap_throw(), root)
388+ mem::replace(&mut *exclusive.component.as_mut().unwrap_throw(), root)
389− };
389+ };
390+
390− VdomWeak::new(&inner).render().map(|_| old)
391+ VdomWeak::new(&inner).render().await?;
391− })
392+
392− })
393+ Ok(old)
393 }
394 }
394
395
395 /// Execute `f` with a reference to this virtual DOM's root rendering
396 /// Execute `f` with a reference to this virtual DOM's root rendering
@@ -397,24 +398,18 @@ impl VdomWeak {
397 ///
398 ///
398 /// To ensure exclusive access to the root rendering component, the
399 /// To ensure exclusive access to the root rendering component, the
399 /// invocation takes place on a new tick of the micro-task queue.
400 /// invocation takes place on a new tick of the micro-task queue.
400− pub fn with_component<F, T>(&self, f: F) -> impl Future<Item = T, Error = VdomDroppedError>
401+ pub async fn with_component<F, T>(&self, f: F) -> Result<T, VdomDroppedError>
401 where
402 where
402 F: 'static + FnOnce(&mut dyn RootRender) -> T,
403 F: 'static + FnOnce(&mut dyn RootRender) -> T,
403 {
404 {
404− futures::future::ok(self.inner.upgrade())
405− .and_then(|inner| inner.ok_or(()))
406− .map_err(|_| VdomDroppedError {})
405+ let inner = self.inner.upgrade().ok_or(VdomDroppedError {})?;
407− .and_then(|inner| {
406+
408− let mut f = Some(f);
407+ // Wait for a new tick of the micro-task queue
409− let promise = js_sys::Promise::resolve(&JsValue::null());
408+ let _ = JsFuture::from(js_sys::Promise::resolve(&JsValue::null())).await;
410− JsFuture::from(promise)
409+
411− .map_err(|_| VdomDroppedError {})
412− .map(move |_| {
413− let f = f.take().unwrap_throw();
414− let mut exclusive = inner.exclusive.borrow_mut();
410+ let mut exclusive = inner.exclusive.borrow_mut();
411+
415− f(exclusive.component_raw_mut())
412+ Ok(f(exclusive.component_raw_mut()))
416− })
417− })
418 }
413 }
419
414
420 /// Schedule a render to occur during the next animation frame.
415 /// Schedule a render to occur during the next animation frame.
@@ -423,7 +418,12 @@ impl VdomWeak {
423 /// `render` instead.
418 /// `render` instead.
424 pub fn schedule_render(&self) {
419 pub fn schedule_render(&self) {
425 debug!("VdomWeak::schedule_render");
420 debug!("VdomWeak::schedule_render");
421+
422+ let future = self.render();
423+
426− wasm_bindgen_futures::spawn_local(self.render().map_err(|_| ()));
424+ wasm_bindgen_futures::spawn_local(async move {
425+ let _ = future.await;
426+ });
427 }
427 }
428
428
429 /// Schedule a render to occur during the next animation frame and return a
429 /// Schedule a render to occur during the next animation frame and return a
@@ -431,41 +431,46 @@ impl VdomWeak {
431 ///
431 ///
432 /// If you don't want to do more things after the render completes, then use
432 /// If you don't want to do more things after the render completes, then use
433 /// `schedule_render` instead of `render`.
433 /// `schedule_render` instead of `render`.
434− pub fn render(&self) -> impl Future<Item = (), Error = VdomDroppedError> {
434+ pub fn render(&self) -> impl Future<Output = Result<(), VdomDroppedError>> {
435− futures::future::ok(self.inner.upgrade())
435+ let inner = self.inner.upgrade();
436− .and_then(|inner| inner.ok_or(()))
436+
437+ async move {
437− .map_err(|_| VdomDroppedError {})
438+ let inner = inner.ok_or(VdomDroppedError {})?;
438− .and_then(|inner| {
439+
439− let promise = inner.shared.render_scheduled.take().unwrap_or_else(|| {
440+ let promise = inner.shared.render_scheduled.take().unwrap_or_else(|| {
440− js_sys::Promise::new(&mut |resolve, reject| {
441+ js_sys::Promise::new(&mut |resolve, reject| {
441− let vdom = VdomWeak {
442+ let vdom = VdomWeak {
442− inner: Rc::downgrade(&inner),
443+ inner: Rc::downgrade(&inner),
443− };
444+ };
445+
444− with_animation_frame(move || match vdom.inner.upgrade() {
446+ with_animation_frame(move || match vdom.inner.upgrade() {
445− None => {
447+ None => {
446− warn!("VdomWeak::render: vdom unmounted before we could render");
448+ warn!("VdomWeak::render: vdom unmounted before we could render");
447− let r = reject.call0(&JsValue::null());
449+ let r = reject.call0(&JsValue::null());
448− debug_assert!(r.is_ok());
450+ debug_assert!(r.is_ok());
449− }
451+ }
450− Some(inner) => {
452+ Some(inner) => {
451− let mut exclusive = inner.exclusive.borrow_mut();
453+ let mut exclusive = inner.exclusive.borrow_mut();
452− exclusive.render();
454+ exclusive.render();
453−
455+
454− // We did the render, so take the promise away
456+ // We did the render, so take the promise away
455− // and let future `render` calls request new
457+ // and let future `render` calls request new
456− // animation frames.
458+ // animation frames.
457− let _ = inner.shared.render_scheduled.take();
459+ let _ = inner.shared.render_scheduled.take();
458−
460+
459− let r = resolve.call0(&JsValue::null());
461+ let r = resolve.call0(&JsValue::null());
460− debug_assert!(r.is_ok());
462+ debug_assert!(r.is_ok());
461− }
463+ }
462− });
464+ });
463− })
465+ })
464− });
466+ });
467+
465− inner.shared.render_scheduled.set(Some(promise.clone()));
468+ inner.shared.render_scheduled.set(Some(promise.clone()));
469+
466− JsFuture::from(promise)
470+ JsFuture::from(promise)
471+ .await
467− .map(|_| ())
472+ .map(drop)
468− .map_err(|_| VdomDroppedError {})
473+ .map_err(|_| VdomDroppedError {})
469− })
474+ }
470 }
475 }
471}
476}
tests/web/cached.rs+73−65
@@ -1,6 +1,5 @@
1use super::{assert_rendered, before_after, create_element, RenderFn};
1use super::{assert_rendered, before_after, create_element, RenderFn};
2use dodrio::{builder::*, bumpalo, Cached, Node, Render, RenderContext, RootRender, Vdom};
2use dodrio::{builder::*, bumpalo, Cached, Node, Render, RenderContext, RootRender, Vdom};
3−use futures::prelude::*;
4use std::cell::Cell;
3use std::cell::Cell;
5use std::rc::Rc;
4use std::rc::Rc;
6use wasm_bindgen::prelude::*;
5use wasm_bindgen::prelude::*;
@@ -19,8 +18,8 @@ impl CountRenders {
19 }
18 }
20}
19}
21
20
22−impl Render for CountRenders {
21+impl<'a> Render<'a> for CountRenders {
23− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
22+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
24 let count = self.render_count.get() + 1;
23 let count = self.render_count.get() + 1;
25 self.render_count.set(count);
24 self.render_count.set(count);
26
25
@@ -29,8 +28,8 @@ impl Render for CountRenders {
29 }
28 }
30}
29}
31
30
32−#[wasm_bindgen_test(async)]
31+#[wasm_bindgen_test]
33−fn uses_cached_render() -> impl Future<Item = (), Error = JsValue> {
32+async fn uses_cached_render() {
34 use dodrio::builder::*;
33 use dodrio::builder::*;
35
34
36 let cached = Cached::new(CountRenders::new());
35 let cached = Cached::new(CountRenders::new());
@@ -50,52 +49,61 @@ fn uses_cached_render() -> impl Future<Item = (), Error = JsValue> {
50 let vdom6 = vdom0.clone();
49 let vdom6 = vdom0.clone();
51 let vdom7 = vdom0.clone();
50 let vdom7 = vdom0.clone();
52
51
52+ // We render, populate the cache, and get "1".
53+ vdom0.weak().render().await.unwrap();
53 vdom0
54 vdom0
54 .weak()
55 .weak()
55− // We render, populate the cache, and get "1".
56− .render()
57− .and_then(move |_| {
58− vdom0.weak().with_component(move |comp| {
56+ .with_component(move |comp| {
59− let comp = comp.unwrap_mut::<Cached<CountRenders>>();
57+ let comp = comp.unwrap_mut::<Cached<CountRenders>>();
60− assert_eq!(comp.render_count.get(), 1);
58+ assert_eq!(comp.render_count.get(), 1);
61− assert_rendered(&container1, &RenderFn(|_| text("1")));
59+ assert_rendered(&container1, &RenderFn(|_| text("1")));
62− })
63 })
60 })
61+ .await
62+ .unwrap();
63+
64− // We re-render, re-use the cached node, and get "1" again.
64+ // We re-render, re-use the cached node, and get "1" again.
65− .and_then(move |_| vdom1.weak().render())
65+ vdom1.weak().render().await.unwrap();
66− .and_then(move |_| {
66+ vdom2
67+ .weak()
67− vdom2.weak().with_component(move |comp| {
68+ .with_component(move |comp| {
68− let comp = comp.unwrap_mut::<Cached<CountRenders>>();
69+ let comp = comp.unwrap_mut::<Cached<CountRenders>>();
69− assert_eq!(comp.render_count.get(), 1);
70+ assert_eq!(comp.render_count.get(), 1);
70− assert_rendered(&container2, &RenderFn(|_| text("1")));
71+ assert_rendered(&container2, &RenderFn(|_| text("1")));
71− })
72 })
72 })
73+ .await
74+ .unwrap();
75+
73− // We invalidate the cache, re-render, re-populate the cache, and should
76+ // We invalidate the cache, re-render, re-populate the cache, and should now have "2".
74− // now have "2".
77+ vdom3
75− .and_then(move |_| {
78+ .weak()
76− vdom3.weak().with_component(move |comp| {
79+ .with_component(move |comp| {
77− let comp = comp.unwrap_mut::<Cached<CountRenders>>();
80+ let comp = comp.unwrap_mut::<Cached<CountRenders>>();
78− Cached::invalidate(comp);
81+ Cached::invalidate(comp);
79− })
80 })
82 })
83+ .await
84+ .unwrap();
81− .and_then(move |_| vdom4.weak().render())
85+ vdom4.weak().render().await.unwrap();
82− .and_then(move |_| {
86+ vdom5
87+ .weak()
83− vdom5.weak().with_component(move |comp| {
88+ .with_component(move |comp| {
84− let comp = comp.unwrap_mut::<Cached<CountRenders>>();
89+ let comp = comp.unwrap_mut::<Cached<CountRenders>>();
85− assert_eq!(comp.render_count.get(), 2);
90+ assert_eq!(comp.render_count.get(), 2);
86− assert_rendered(&container3, &RenderFn(|_| text("2")));
91+ assert_rendered(&container3, &RenderFn(|_| text("2")));
87− })
88 })
92 })
93+ .await
94+ .unwrap();
95+
89− // We re-render, re-use the cached node, and get "2" again.
96+ // We re-render, re-use the cached node, and get "2" again.
90− .and_then(move |_| vdom6.weak().render())
97+ vdom6.weak().render().await.unwrap();
91− .and_then(move |_| {
98+ vdom7
99+ .weak()
92− vdom7.weak().with_component(move |comp| {
100+ .with_component(move |comp| {
93− let comp = comp.unwrap_mut::<Cached<CountRenders>>();
101+ let comp = comp.unwrap_mut::<Cached<CountRenders>>();
94− assert_eq!(comp.render_count.get(), 2);
102+ assert_eq!(comp.render_count.get(), 2);
95− assert_rendered(&container4, &RenderFn(|_| text("2")));
103+ assert_rendered(&container4, &RenderFn(|_| text("2")));
96− })
97 })
104 })
98− .map_err(|e| JsValue::from(e.to_string()))
105+ .await
106+ .unwrap();
99}
107}
100
108
101#[wasm_bindgen(module = "/tests/web/cached.js")]
109#[wasm_bindgen(module = "/tests/web/cached.js")]
@@ -104,8 +112,8 @@ extern "C" {
104 fn get_clone_node_count() -> u32;
112 fn get_clone_node_count() -> u32;
105}
113}
106
114
107−#[wasm_bindgen_test(async)]
115+#[wasm_bindgen_test]
108−fn creating_cached_nodes_uses_clone_node() -> impl Future<Item = (), Error = JsValue> {
116+async fn creating_cached_nodes_uses_clone_node() {
109 use dodrio::builder::*;
117 use dodrio::builder::*;
110
118
111 let container = create_element("div");
119 let container = create_element("div");
@@ -113,28 +121,28 @@ fn creating_cached_nodes_uses_clone_node() -> impl Future<Item = (), Error = JsV
113 // The initial vdom render should populate the cache and save a template.
121 // The initial vdom render should populate the cache and save a template.
114 let vdom0 = Rc::new(Vdom::new(&container, Cached::new(CountRenders::new())));
122 let vdom0 = Rc::new(Vdom::new(&container, Cached::new(CountRenders::new())));
115 let vdom1 = vdom0.clone();
123 let vdom1 = vdom0.clone();
116− let vdom2 = vdom0.clone();
124+ let _vdom2 = vdom0.clone();
117
125
118 let clone_node_count_before = get_clone_node_count();
126 let clone_node_count_before = get_clone_node_count();
119
127
128+ // Render something entirely different...
120 vdom0
129 vdom0
121 .weak()
130 .weak()
122− // Render something entirely different...
123− .set_component(Box::new(RenderFn(|_| text("hi"))) as Box<RootRender>)
131+ .set_component(Box::new(RenderFn(|_| text("hi"))) as Box<dyn RootRender>)
124− .and_then(move |_| {
132+ .await
133+ .unwrap();
134+
125− // Re-render our cached node. Since we are creating it from scratch,
135+ // Re-render our cached node. Since we are creating it from scratch,
126− // and already have a template from the earlier render, we should
136+ // and already have a template from the earlier render, we should
127− // call `cloneNode` here.
137+ // call `cloneNode` here.
128− vdom1
138+ vdom1
129− .weak()
139+ .weak()
130− .set_component(Box::new(Cached::new(CountRenders::new())) as Box<RootRender>)
140+ .set_component(Box::new(Cached::new(CountRenders::new())) as Box<dyn RootRender>)
131− })
141+ .await
132− .map(move |_| {
142+ .unwrap();
143+
133− let clone_node_count_after = get_clone_node_count();
144+ let clone_node_count_after = get_clone_node_count();
134− assert_eq!(clone_node_count_after, clone_node_count_before + 1);
145+ assert_eq!(clone_node_count_after, clone_node_count_before + 1);
135− drop(vdom2);
136− })
137− .map_err(|e| JsValue::from(e.to_string()))
138}
146}
139
147
140struct Id(&'static str);
148struct Id(&'static str);
@@ -145,8 +153,8 @@ impl Default for Id {
145 }
153 }
146}
154}
147
155
148−impl Render for Id {
156+impl<'a> Render<'a> for Id {
149− fn render<'a>(&self, _cx: &mut RenderContext<'a>) -> Node<'a> {
157+ fn render(&self, _cx: &mut RenderContext<'a>) -> Node<'a> {
150 text(self.0)
158 text(self.0)
151 }
159 }
152}
160}
tests/web/events.rs+56−73
@@ -1,6 +1,6 @@
1use super::create_element;
1use super::create_element;
2use dodrio::{Node, Render, RenderContext, Vdom};
2use dodrio::{Node, Render, RenderContext, Vdom};
3−use futures::Future;
3+use futures::future::{select, Either};
4use std::cell::{Cell, RefCell};
4use std::cell::{Cell, RefCell};
5use std::rc::Rc;
5use std::rc::Rc;
6use wasm_bindgen::prelude::*;
6use wasm_bindgen::prelude::*;
@@ -9,7 +9,7 @@ use wasm_bindgen_test::*;
9
9
10struct EventContainer {
10struct EventContainer {
11 event: &'static str,
11 event: &'static str,
12− on_event: Box<FnMut()>,
12+ on_event: Box<dyn FnMut()>,
13}
13}
14
14
15impl EventContainer {
15impl EventContainer {
@@ -24,8 +24,8 @@ impl EventContainer {
24 }
24 }
25}
25}
26
26
27−impl Render for EventContainer {
27+impl<'a> Render<'a> for EventContainer {
28− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
28+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
29 use dodrio::builder::*;
29 use dodrio::builder::*;
30 div(&cx)
30 div(&cx)
31 .attr("id", "target")
31 .attr("id", "target")
@@ -44,14 +44,14 @@ fn target(container: &web_sys::Element) -> web_sys::HtmlElement {
44 .unchecked_into()
44 .unchecked_into()
45}
45}
46
46
47−#[wasm_bindgen_test(async)]
47+#[wasm_bindgen_test]
48−fn click() -> impl Future<Item = (), Error = JsValue> {
48+async fn click() {
49 let container = create_element("div");
49 let container = create_element("div");
50
50
51− let (sender, receiver) = futures::sync::oneshot::channel();
51+ let (sender, receiver) = futures::channel::oneshot::channel();
52 let mut sender = Some(sender);
52 let mut sender = Some(sender);
53
53
54− let vdom = Vdom::new(
54+ let _vdom = Vdom::new(
55 &container,
55 &container,
56 EventContainer::new("click", move || {
56 EventContainer::new("click", move || {
57 sender
57 sender
@@ -64,18 +64,14 @@ fn click() -> impl Future<Item = (), Error = JsValue> {
64
64
65 target(&container).click();
65 target(&container).click();
66
66
67− receiver
67+ receiver.await.unwrap();
68− .map(|_| {
69− drop(vdom);
70− })
71− .map_err(|e| JsValue::from(e.to_string()))
72}
68}
73
69
74−#[wasm_bindgen_test(async)]
70+#[wasm_bindgen_test]
75−fn updated_listener_is_called() -> impl Future<Item = (), Error = JsValue> {
71+async fn updated_listener_is_called() {
76 let container = create_element("div");
72 let container = create_element("div");
77
73
78− let (first_sender, first_receiver) = futures::sync::oneshot::channel();
74+ let (first_sender, first_receiver) = futures::channel::oneshot::channel();
79 let mut first_sender = Some(first_sender);
75 let mut first_sender = Some(first_sender);
80
76
81 let vdom = Vdom::new(
77 let vdom = Vdom::new(
@@ -89,7 +85,7 @@ fn updated_listener_is_called() -> impl Future<Item = (), Error = JsValue> {
89 }),
85 }),
90 );
86 );
91
87
92− let (second_sender, second_receiver) = futures::sync::oneshot::channel();
88+ let (second_sender, second_receiver) = futures::channel::oneshot::channel();
93 let mut second_sender = Some(second_sender);
89 let mut second_sender = Some(second_sender);
94
90
95 vdom.weak()
91 vdom.weak()
@@ -100,25 +96,22 @@ fn updated_listener_is_called() -> impl Future<Item = (), Error = JsValue> {
100 .send("second")
96 .send("second")
101 .expect_throw("should not have dropped the receiver");
97 .expect_throw("should not have dropped the receiver");
102 })))
98 })))
103− .map_err(|e| JsValue::from(e.to_string()))
99+ .await
104− .and_then(move |_| {
100+ .unwrap();
101+
105− target(&container).click();
102+ target(&container).click();
106−
103+
107− first_receiver
108− .select(second_receiver)
104+ match select(first_receiver, second_receiver).await {
109− .map(|(which, _other)| which)
105+ Either::Left((Ok(_), _)) => panic!(),
110− .or_else(|(_error, other)| other)
111− .map(|which| {
112− assert_eq!(which, "second");
106+ Either::Left((Err(_), second)) => assert_eq!(second.await, Ok("second")),
113− drop(vdom);
107+ Either::Right((Ok(msg), _)) => assert_eq!(msg, "second"),
114− })
108+ Either::Right((Err(_), _)) => panic!(),
115− .map_err(|e| JsValue::from(e.to_string()))
116− })
109+ }
117}
110}
118
111
119struct ListensOnlyOnFirstRender {
112struct ListensOnlyOnFirstRender {
120 count: Cell<usize>,
113 count: Cell<usize>,
121− callback: Box<FnMut()>,
114+ callback: Box<dyn FnMut()>,
122}
115}
123
116
124impl ListensOnlyOnFirstRender {
117impl ListensOnlyOnFirstRender {
@@ -133,8 +126,8 @@ impl ListensOnlyOnFirstRender {
133 }
126 }
134}
127}
135
128
136−impl Render for ListensOnlyOnFirstRender {
129+impl<'a> Render<'a> for ListensOnlyOnFirstRender {
137− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
130+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
138 use dodrio::builder::*;
131 use dodrio::builder::*;
139
132
140 let count = self.count.get();
133 let count = self.count.get();
@@ -150,11 +143,11 @@ impl Render for ListensOnlyOnFirstRender {
150 }
143 }
151}
144}
152
145
153−#[wasm_bindgen_test(async)]
146+#[wasm_bindgen_test]
154−fn removed_listener_is_not_called() -> impl Future<Item = (), Error = JsValue> {
147+async fn removed_listener_is_not_called() {
155 let container = create_element("div");
148 let container = create_element("div");
156
149
157− let (outer_sender, outer_receiver) = futures::sync::oneshot::channel();
150+ let (outer_sender, outer_receiver) = futures::channel::oneshot::channel();
158 let outer_sender = Rc::new(RefCell::new(Some(outer_sender)));
151 let outer_sender = Rc::new(RefCell::new(Some(outer_sender)));
159 let outer_listener = Closure::wrap(Box::new(move |_| {
152 let outer_listener = Closure::wrap(Box::new(move |_| {
160 outer_sender
153 outer_sender
@@ -163,13 +156,13 @@ fn removed_listener_is_not_called() -> impl Future<Item = (), Error = JsValue> {
163 .expect_throw("should only invoke outer_listener once")
156 .expect_throw("should only invoke outer_listener once")
164 .send("outer")
157 .send("outer")
165 .expect_throw("should not have dropped receiver");
158 .expect_throw("should not have dropped receiver");
166− }) as Box<FnMut(web_sys::Event)>);
159+ }) as Box<dyn FnMut(web_sys::Event)>);
167
160
168 container
161 container
169 .add_event_listener_with_callback("click", outer_listener.as_ref().unchecked_ref())
162 .add_event_listener_with_callback("click", outer_listener.as_ref().unchecked_ref())
170 .unwrap();
163 .unwrap();
171
164
172− let (vdom_sender, vdom_receiver) = futures::sync::oneshot::channel();
165+ let (vdom_sender, vdom_receiver) = futures::channel::oneshot::channel();
173 let mut vdom_sender = Some(vdom_sender);
166 let mut vdom_sender = Some(vdom_sender);
174
167
175 // Render a vdom with a listener into container.
168 // Render a vdom with a listener into container.
@@ -184,33 +177,26 @@ fn removed_listener_is_not_called() -> impl Future<Item = (), Error = JsValue> {
184 }),
177 }),
185 );
178 );
186
179
187− vdom.weak()
188− // Re-render, so we aren't listening anymore.
180+ // Re-render, so we aren't listening anymore.
189− .render()
181+ vdom.weak().render().await.unwrap();
190− .map_err(|e| JsValue::from(e.to_string()))
182+
191− .and_then(move |_| {
192− target(&container).click();
183+ target(&container).click();
193−
184+
194− // We should get our container's event handler fired, and not the unmounted
185+ // We should get our container's event handler fired, and not the unmounted
195− // vdom's event handler.
186+ // vdom's event handler.
196− outer_receiver
197− .select(vdom_receiver)
187+ match select(outer_receiver, vdom_receiver).await {
198− .map(|(which, _other)| which)
188+ Either::Left((Ok(msg), _)) => assert_eq!(msg, ("outer")),
199− .or_else(|(_error, other)| other)
189+ Either::Left((Err(_), _)) => panic!(),
200− .map(|which| {
190+ Either::Right((Ok(_), _)) => panic!(),
201− assert_eq!(which, "outer");
191+ Either::Right((Err(_), outer)) => assert_eq!(outer.await, Ok("outer")),
202− drop(outer_listener);
203− drop(vdom)
204− })
205− .map_err(|e| JsValue::from(e.to_string()))
206− })
192+ }
207}
193}
208
194
209−#[wasm_bindgen_test(async)]
195+#[wasm_bindgen_test]
210−fn event_does_not_fire_after_unmounting() -> impl Future<Item = (), Error = JsValue> {
196+async fn event_does_not_fire_after_unmounting() {
211 let container = create_element("div");
197 let container = create_element("div");
212
198
213− let (outer_sender, outer_receiver) = futures::sync::oneshot::channel();
199+ let (outer_sender, outer_receiver) = futures::channel::oneshot::channel();
214 let outer_sender = Rc::new(RefCell::new(Some(outer_sender)));
200 let outer_sender = Rc::new(RefCell::new(Some(outer_sender)));
215 let outer_listener = Closure::wrap(Box::new(move |_| {
201 let outer_listener = Closure::wrap(Box::new(move |_| {
216 outer_sender
202 outer_sender
@@ -219,13 +205,13 @@ fn event_does_not_fire_after_unmounting() -> impl Future<Item = (), Error = JsVa
219 .expect_throw("should only invoke outer_listener once")
205 .expect_throw("should only invoke outer_listener once")
220 .send("outer")
206 .send("outer")
221 .expect_throw("should not have dropped receiver");
207 .expect_throw("should not have dropped receiver");
222− }) as Box<FnMut(web_sys::Event)>);
208+ }) as Box<dyn FnMut(web_sys::Event)>);
223
209
224 container
210 container
225 .add_event_listener_with_callback("click", outer_listener.as_ref().unchecked_ref())
211 .add_event_listener_with_callback("click", outer_listener.as_ref().unchecked_ref())
226 .unwrap();
212 .unwrap();
227
213
228− let (vdom_sender, vdom_receiver) = futures::sync::oneshot::channel();
214+ let (vdom_sender, vdom_receiver) = futures::channel::oneshot::channel();
229 let mut vdom_sender = Some(vdom_sender);
215 let mut vdom_sender = Some(vdom_sender);
230
216
231 // Render a vdom with a listener into container.
217 // Render a vdom with a listener into container.
@@ -255,13 +241,10 @@ fn event_does_not_fire_after_unmounting() -> impl Future<Item = (), Error = JsVa
255
241
256 // We should get our container's event handler fired, and not the unmounted
242 // We should get our container's event handler fired, and not the unmounted
257 // vdom's event handler.
243 // vdom's event handler.
258− outer_receiver
259− .select(vdom_receiver)
244+ match select(outer_receiver, vdom_receiver).await {
260− .map(|(which, _other)| which)
261− .or_else(|(_error, other)| other)
262− .map(|which| {
263− assert_eq!(which, "outer");
245+ Either::Left((Ok(msg), _)) => assert_eq!(msg, ("outer")),
264− drop(outer_listener);
246+ Either::Left((Err(_), _)) => panic!(),
247+ Either::Right((Ok(_), _)) => panic!(),
248+ Either::Right((Err(_), outer)) => assert_eq!(outer.await, Ok("outer")),
265− })
249+ }
266− .map_err(|e| JsValue::from(e.to_string()))
267}
250}
tests/web/js_api.rs+30−37
@@ -1,8 +1,7 @@
1use super::{assert_rendered, create_element, RenderFn};
1use super::{assert_rendered, create_element, RenderFn};
2use dodrio::{builder::*, Node, Render, RenderContext, Vdom};
2use dodrio::{builder::*, Node, Render, RenderContext, Vdom};
3use dodrio_js_api::JsRender;
3use dodrio_js_api::JsRender;
4−use futures::prelude::*;
4+use futures::channel::oneshot;
5−use futures::sync::oneshot;
6use js_sys::Object;
5use js_sys::Object;
7use std::rc::Rc;
6use std::rc::Rc;
8use wasm_bindgen::prelude::*;
7use wasm_bindgen::prelude::*;
@@ -14,7 +13,7 @@ pub struct WrapJs {
14}
13}
15
14
16impl WrapJs {
15impl WrapJs {
17− pub fn new() -> (WrapJs, oneshot::Receiver<()>, Closure<FnMut()>) {
16+ pub fn new() -> (WrapJs, oneshot::Receiver<()>, Closure<dyn FnMut()>) {
18 let (sender, receiver) = oneshot::channel();
17 let (sender, receiver) = oneshot::channel();
19
18
20 let on_after_render = Closure::wrap(Box::new({
19 let on_after_render = Closure::wrap(Box::new({
@@ -26,7 +25,7 @@ impl WrapJs {
26 .send(())
25 .send(())
27 .expect_throw("receiver should not have been dropped");
26 .expect_throw("receiver should not have been dropped");
28 }
27 }
29− }) as Box<FnMut()>);
28+ }) as Box<dyn FnMut()>);
30
29
31 let component = WrapJs {
30 let component = WrapJs {
32 inner: JsRender::new(JsComponent::new(&on_after_render)),
31 inner: JsRender::new(JsComponent::new(&on_after_render)),
@@ -36,8 +35,8 @@ impl WrapJs {
36 }
35 }
37}
36}
38
37
39−impl Render for WrapJs {
38+impl<'a> Render<'a> for WrapJs {
40− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
39+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
41 div(&cx)
40 div(&cx)
42 .attr("class", "wrap-js")
41 .attr("class", "wrap-js")
43 .children([self.inner.render(cx)])
42 .children([self.inner.render(cx)])
@@ -52,7 +51,7 @@ extern "C" {
52 type JsComponent;
51 type JsComponent;
53
52
54 #[wasm_bindgen(constructor)]
53 #[wasm_bindgen(constructor)]
55− fn new(on_after_render: &Closure<FnMut()>) -> JsComponent;
54+ fn new(on_after_render: &Closure<dyn FnMut()>) -> JsComponent;
56}
55}
57
56
58fn eval_js_rendering_component() {
57fn eval_js_rendering_component() {
@@ -96,14 +95,14 @@ fn eval_js_rendering_component() {
96 });
95 });
97}
96}
98
97
99−#[wasm_bindgen_test(async)]
98+#[wasm_bindgen_test]
100−fn can_use_js_rendering_components() -> impl Future<Item = (), Error = JsValue> {
99+async fn can_use_js_rendering_components() {
101 eval_js_rendering_component();
100 eval_js_rendering_component();
102
101
103 let container = create_element("div");
102 let container = create_element("div");
104− let (component, receiver, closure) = WrapJs::new();
103+ let (component, receiver, _closure) = WrapJs::new();
104+ let _vdom = Rc::new(Vdom::new(&container, component));
105
105
106− let vdom = Rc::new(Vdom::new(&container, component));
107 assert_rendered(
106 assert_rendered(
108 &container,
107 &container,
109 &RenderFn(|cx| {
108 &RenderFn(|cx| {
@@ -131,30 +130,24 @@ fn can_use_js_rendering_components() -> impl Future<Item = (), Error = JsValue>
131 .expect_throw("should be an `HTMLElement` object")
130 .expect_throw("should be an `HTMLElement` object")
132 .click();
131 .click();
133
132
134− receiver
133+ receiver.await.unwrap();
135− .map(move |_| {
134+
136− assert_rendered(
135+ assert_rendered(
137− &container,
136+ &container,
138− &RenderFn(|cx| {
137+ &RenderFn(|cx| {
139− div(&cx)
138+ div(&cx)
140− .attr("class", "wrap-js")
139+ .attr("class", "wrap-js")
141− .children([span(&cx)
140+ .children([span(&cx)
142− .attr("class", "js-component")
141+ .attr("class", "js-component")
143− .children([
142+ .children([
144− text("Here is some plain text"),
143+ text("Here is some plain text"),
145− b(&cx)
144+ b(&cx)
146− .children([text("...and here is some bold text")])
145+ .children([text("...and here is some bold text")])
147− .finish(),
146+ .finish(),
148− text("1"),
147+ text("1"),
149− ])
148+ ])
150− .finish()])
149+ .finish()])
151− .finish()
150+ .finish()
152− }),
151+ }),
153− );
152+ );
154−
155− drop(vdom);
156− drop(container);
157− drop(closure);
158− })
159− .map_err(|e| e.to_string().into())
160}
153}
tests/web/keyed.rs+18−19
@@ -1,6 +1,5 @@
1use crate::{assert_rendered, create_element};
1use crate::{assert_rendered, create_element};
2use dodrio::{builder::*, bumpalo, Node, Render, RenderContext, Vdom};
2use dodrio::{builder::*, bumpalo, Node, Render, RenderContext, Vdom};
3−use futures::Future;
4use log::*;
3use log::*;
5use std::rc::Rc;
4use std::rc::Rc;
6use wasm_bindgen::prelude::*;
5use wasm_bindgen::prelude::*;
@@ -8,8 +7,8 @@ use wasm_bindgen_test::*;
8
7
9struct Keyed(u16);
8struct Keyed(u16);
10
9
11−impl Render for Keyed {
10+impl<'a> Render<'a> for Keyed {
12− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
11+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
13 let key = bumpalo::format!(in cx.bump, "{}", self.0).into_bump_str();
12 let key = bumpalo::format!(in cx.bump, "{}", self.0).into_bump_str();
14 div(&cx)
13 div(&cx)
15 .attr("class", "keyed")
14 .attr("class", "keyed")
@@ -32,13 +31,10 @@ where
32 parent.finish()
31 parent.finish()
33}
32}
34
33
35−fn assert_keyed<Before, After>(
34+async fn assert_keyed<Before, After>(before: Before, after: After) -> Result<(), JsValue>
36− before: Before,
37− after: After,
38−) -> impl Future<Item = (), Error = JsValue>
39where
35where
40− Before: 'static + Render,
36+ Before: 'static + for<'a> Render<'a>,
41− After: 'static + Render,
37+ After: 'static + for<'a> Render<'a>,
42{
38{
43 #[wasm_bindgen(module = "/tests/web/keyed.js")]
39 #[wasm_bindgen(module = "/tests/web/keyed.js")]
44 extern "C" {
40 extern "C" {
@@ -56,7 +52,7 @@ where
56
52
57 debug!("====== Rendering the *before* DOM into the physical DOM ======");
53 debug!("====== Rendering the *before* DOM into the physical DOM ======");
58 let vdom1 = Rc::new(Vdom::new(&container, before.clone()));
54 let vdom1 = Rc::new(Vdom::new(&container, before.clone()));
59− let vdom2 = vdom1.clone();
55+ let _vdom2 = vdom1.clone();
60 let saved = save_keyed_elements(&container);
56 let saved = save_keyed_elements(&container);
61
57
62 debug!("====== Checking the *before* DOM against the physical DOM ======");
58 debug!("====== Checking the *before* DOM against the physical DOM ======");
@@ -65,13 +61,14 @@ where
65 debug!("====== Rendering the *after* DOM into the physical DOM ======");
61 debug!("====== Rendering the *after* DOM into the physical DOM ======");
66 let weak = vdom1.weak();
62 let weak = vdom1.weak();
67 weak.set_component(Box::new(after.clone()))
63 weak.set_component(Box::new(after.clone()))
68− .map(move |_| {
64+ .await
65+ .map_err(|e| e.to_string())?;
66+
69− debug!("====== Checking the *after* DOM against the physical DOM ======");
67+ debug!("====== Checking the *after* DOM against the physical DOM ======");
70− assert_rendered(&container, &after);
68+ assert_rendered(&container, &after);
71− check_keyed_elements(&container, saved);
69+ check_keyed_elements(&container, saved);
72− drop(vdom2);
70+
73− })
71+ Ok(())
74− .map_err(|e| JsValue::from(e.to_string()))
75}
72}
76
73
77macro_rules! keyed_tests {
74macro_rules! keyed_tests {
@@ -86,14 +83,16 @@ macro_rules! keyed_tests {
86 }
83 }
87 )* ) => {
84 )* ) => {
88 $(
85 $(
89− #[wasm_bindgen_test(async)]
86+ #[wasm_bindgen_test]
90− fn $name() -> impl Future<Item = (), Error = wasm_bindgen::JsValue> {
87+ async fn $name() {
91 use crate::RenderFn;
88 use crate::RenderFn;
92 log::debug!("############### {} ###############", stringify!($name));
89 log::debug!("############### {} ###############", stringify!($name));
93 assert_keyed(
90 assert_keyed(
94 RenderFn(|$before_cx| { $( $before )* }),
91 RenderFn(|$before_cx| { $( $before )* }),
95 RenderFn(|$after_cx| { $( $after )* }),
92 RenderFn(|$after_cx| { $( $after )* }),
96 )
93 )
94+ .await
95+ .unwrap()
97 }
96 }
98 )*
97 )*
99 }
98 }
tests/web/main.rs+19−17
@@ -6,7 +6,6 @@ use bumpalo::Bump;
6use dodrio::{
6use dodrio::{
7 Attribute, CachedSet, ElementNode, Node, NodeKind, Render, RenderContext, TextNode, Vdom,
7 Attribute, CachedSet, ElementNode, Node, NodeKind, Render, RenderContext, TextNode, Vdom,
8};
8};
9−use futures::prelude::*;
10use fxhash::FxHashMap;
9use fxhash::FxHashMap;
11use log::*;
10use log::*;
12use std::cell::RefCell;
11use std::cell::RefCell;
@@ -51,7 +50,7 @@ pub fn init_logging() {
51
50
52/// Assert that the `container` contains the physical DOM tree that matches
51/// Assert that the `container` contains the physical DOM tree that matches
53/// `r`'s rendered virtual DOM.
52/// `r`'s rendered virtual DOM.
54−pub fn assert_rendered<R: Render>(container: &web_sys::Element, r: &R) {
53+pub fn assert_rendered<R: for<'a> Render<'a>>(container: &web_sys::Element, r: &R) {
55 init_logging();
54 init_logging();
56
55
57 let cached_set = &RefCell::new(CachedSet::default());
56 let cached_set = &RefCell::new(CachedSet::default());
@@ -156,11 +155,11 @@ pub struct RenderFn<F>(F)
156where
155where
157 F: for<'a> Fn(&mut RenderContext<'a>) -> Node<'a>;
156 F: for<'a> Fn(&mut RenderContext<'a>) -> Node<'a>;
158
157
159−impl<F> Render for RenderFn<F>
158+impl<'a, F> Render<'a> for RenderFn<F>
160where
159where
161− F: for<'a> Fn(&mut RenderContext<'a>) -> Node<'a>,
160+ F: for<'b> Fn(&mut RenderContext<'b>) -> Node<'b>,
162{
161{
163− fn render<'a>(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
162+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
164 (self.0)(cx)
163 (self.0)(cx)
165 }
164 }
166}
165}
@@ -168,10 +167,10 @@ where
168/// Assert that if we start by rendering the `before` virtual DOM tree into a
167/// Assert that if we start by rendering the `before` virtual DOM tree into a
169/// physical DOM tree, and then diff it with the `after` virtual DOM tree, then
168/// physical DOM tree, and then diff it with the `after` virtual DOM tree, then
170/// the physical DOM tree correctly matches `after`.
169/// the physical DOM tree correctly matches `after`.
171−pub fn assert_before_after<R, S>(before: R, after: S) -> impl Future<Item = (), Error = JsValue>
170+pub async fn assert_before_after<R, S>(before: R, after: S) -> Result<(), JsValue>
172where
171where
173− R: 'static + Render,
172+ R: 'static + for<'a> Render<'a>,
174− S: 'static + Render,
173+ S: 'static + for<'a> Render<'a>,
175{
174{
176 let container = create_element("div");
175 let container = create_element("div");
177
176
@@ -180,7 +179,7 @@ where
180
179
181 debug!("====== Rendering the *before* DOM into the physical DOM ======");
180 debug!("====== Rendering the *before* DOM into the physical DOM ======");
182 let vdom1 = Rc::new(Vdom::new(&container, before.clone()));
181 let vdom1 = Rc::new(Vdom::new(&container, before.clone()));
183− let vdom2 = vdom1.clone();
182+ let _vdom2 = vdom1.clone();
184
183
185 debug!("====== Checking the *before* DOM against the physical DOM ======");
184 debug!("====== Checking the *before* DOM against the physical DOM ======");
186 assert_rendered(&container, &before);
185 assert_rendered(&container, &before);
@@ -188,12 +187,13 @@ where
188 debug!("====== Rendering the *after* DOM into the physical DOM ======");
187 debug!("====== Rendering the *after* DOM into the physical DOM ======");
189 let weak = vdom1.weak();
188 let weak = vdom1.weak();
190 weak.set_component(Box::new(after.clone()))
189 weak.set_component(Box::new(after.clone()))
191− .map(move |_| {
190+ .await
191+ .map_err(|e| e.to_string())?;
192+
192− debug!("====== Checking the *after* DOM against the physical DOM ======");
193+ debug!("====== Checking the *after* DOM against the physical DOM ======");
193− assert_rendered(&container, &after);
194+ assert_rendered(&container, &after);
194− drop(vdom2);
195+
195− })
196+ Ok(())
196− .map_err(|e| JsValue::from(e.to_string()))
197}
197}
198
198
199/// A helper macro for declaring a bunch of `assert_before_after` tests.
199/// A helper macro for declaring a bunch of `assert_before_after` tests.
@@ -210,14 +210,16 @@ macro_rules! before_after {
210 }
210 }
211 )* ) => {
211 )* ) => {
212 $(
212 $(
213− #[wasm_bindgen_test(async)]
213+ #[wasm_bindgen_test]
214− fn $name() -> impl Future<Item = (), Error = wasm_bindgen::JsValue> {
214+ async fn $name() {
215 use crate::{assert_before_after, RenderFn};
215 use crate::{assert_before_after, RenderFn};
216 log::debug!("############### {} ###############", stringify!($name));
216 log::debug!("############### {} ###############", stringify!($name));
217 assert_before_after(
217 assert_before_after(
218 RenderFn(|$before_bump| { $( $before )* }),
218 RenderFn(|$before_bump| { $( $before )* }),
219 RenderFn(|$after_bump| { $( $after )* })
219 RenderFn(|$after_bump| { $( $after )* })
220 )
220 )
221+ .await
222+ .unwrap()
221 }
223 }
222 )*
224 )*
223 }
225 }
tests/web/render.rs+89−2
@@ -1,7 +1,7 @@
1use super::{assert_rendered, before_after, create_element, RenderFn};
1use super::{assert_rendered, before_after, create_element, RenderFn};
2−use dodrio::{builder::*, Vdom};
2+use dodrio::{builder::*, bumpalo::collections::String, Node, Render, RenderContext, Vdom};
3−use futures::prelude::*;
4use std::rc::Rc;
3use std::rc::Rc;
4+use wasm_bindgen::{ JsCast};
5use wasm_bindgen_test::*;
5use wasm_bindgen_test::*;
6
6
7#[wasm_bindgen_test]
7#[wasm_bindgen_test]
@@ -35,6 +35,93 @@ fn container_is_emptied_upon_drop() {
35 assert!(container.first_child().is_none());
35 assert!(container.first_child().is_none());
36}
36}
37
37
38+/// Renders a child with a lifetime scoped to the RenderContext bump arena.
39+#[wasm_bindgen_test]
40+fn render_bump_scoped_node() {
41+ struct Child<'a> {
42+ name: &'a str,
43+ }
44+
45+ impl<'a> Render<'a> for Child<'a> {
46+ fn render(&self, _cx: &mut RenderContext<'a>) -> Node<'a> {
47+ text(self.name)
48+ }
49+ }
50+
51+ struct Parent;
52+
53+ impl<'a> Render<'a> for Parent {
54+ fn render(&self, cx: &mut RenderContext<'a>) -> Node<'a> {
55+ let child_name = String::from_str_in("child", cx.bump).into_bump_str();
56+
57+ div(&cx)
58+ .children([Child { name: child_name }.render(cx)])
59+ .finish()
60+ }
61+ }
62+
63+ let parent = Rc::new(RenderFn(|cx| {
64+ Parent.render(cx)
65+ }));
66+
67+ let container = create_element("div");
68+ let _vdom = Vdom::new(&container, parent.clone());
69+
70+ assert_rendered(&container, &parent);
71+}
72+
73+/// Originally, dodrio would use the className property for SVGs.
74+///
75+/// This is problematic because when SVG elements are created, the className is flagged as a read
76+/// only property, so setting it causes an exception to be thrown. Here's an example of how this
77+/// happens:
78+///
79+/// let elem = web_sys::window()
80+/// .unwrap()
81+/// .document()
82+/// .unwrap()
83+/// .create_element_ns(Some("http://www.w3.org/2000/svg"), "svg")
84+/// .unwrap();
85+///
86+/// elem.set_class_name("does-not-work");
87+///
88+/// -----------------------------------------------------------------------------------------------
89+///
90+/// wasm-bindgen: imported JS function that was not marked as `catch` threw an error:
91+/// setting getter-only property "className"
92+///
93+/// -----------------------------------------------------------------------------------------------
94+///
95+/// Now, dodrio passes the 'class' attribute of all namespaced elements into set_attribute. This
96+/// satisfies the restrictions on SVG and keeps the optimized path for non-namespaced elements
97+#[wasm_bindgen_test(async)]
98+async fn test_svg_set_class() {
99+ let container = create_element("div");
100+
101+
102+ let valid_svg = Rc::new(RenderFn(|cx| {
103+ ElementBuilder::new(cx.bump, "svg")
104+ .namespace(Some("http://www.w3.org/2000/svg"))
105+ .attr("class", "works")
106+ .finish()
107+ }));
108+
109+ let vdom = Vdom::new(&container, valid_svg.clone());
110+ let weak = vdom.weak();
111+
112+ weak.render().await.unwrap();
113+
114+ assert_eq!(
115+ "works",
116+ container.first_child()
117+ .expect("unable to get svg")
118+ .dyn_ref::<web_sys::Element>()
119+ .expect("svg should be an element")
120+ .get_attribute("class")
121+ .expect("unable to get 'class' of svg")
122+ );
123+}
124+
38before_after! {
125before_after! {
39 same_text {
126 same_text {
40 before(_cx) {
127 before(_cx) {