UNPKG

41.5 kBHTMLView Raw
1<!doctype html>
2<html lang="en">
3<head>
4 <title>Code coverage report for lib/tree.js</title>
5 <meta charset="utf-8" />
6 <link rel="stylesheet" href="../prettify.css" />
7 <link rel="stylesheet" href="../base.css" />
8 <meta name="viewport" content="width=device-width, initial-scale=1">
9 <style type='text/css'>
10 .coverage-summary .sorter {
11 background-image: url(../sort-arrow-sprite.png);
12 }
13 </style>
14</head>
15<body>
16<div class='wrapper'>
17 <div class='pad1'>
18 <h1>
19 <a href="../index.html">all files</a> / <a href="index.html">lib/</a> tree.js
20 </h1>
21 <div class='clearfix'>
22 <div class='fl pad1y space-right2'>
23 <span class="strong">100% </span>
24 <span class="quiet">Statements</span>
25 <span class='fraction'>169/169</span>
26 </div>
27 <div class='fl pad1y space-right2'>
28 <span class="strong">97.62% </span>
29 <span class="quiet">Branches</span>
30 <span class='fraction'>41/42</span>
31 </div>
32 <div class='fl pad1y space-right2'>
33 <span class="strong">100% </span>
34 <span class="quiet">Functions</span>
35 <span class='fraction'>25/25</span>
36 </div>
37 <div class='fl pad1y space-right2'>
38 <span class="strong">100% </span>
39 <span class="quiet">Lines</span>
40 <span class='fraction'>160/160</span>
41 </div>
42 </div>
43 </div>
44 <div class='status-line high'></div>
45<pre><table class="coverage">
46<tr><td class="line-count quiet">1
472
483
494
505
516
527
538
549
5510
5611
5712
5813
5914
6015
6116
6217
6318
6419
6520
6621
6722
6823
6924
7025
7126
7227
7328
7429
7530
7631
7732
7833
7934
8035
8136
8237
8338
8439
8540
8641
8742
8843
8944
9045
9146
9247
9348
9449
9550
9651
9752
9853
9954
10055
10156
10257
10358
10459
10560
10661
10762
10863
10964
11065
11166
11267
11368
11469
11570
11671
11772
11873
11974
12075
12176
12277
12378
12479
12580
12681
12782
12883
12984
13085
13186
13287
13388
13489
13590
13691
13792
13893
13994
14095
14196
14297
14398
14499
145100
146101
147102
148103
149104
150105
151106
152107
153108
154109
155110
156111
157112
158113
159114
160115
161116
162117
163118
164119
165120
166121
167122
168123
169124
170125
171126
172127
173128
174129
175130
176131
177132
178133
179134
180135
181136
182137
183138
184139
185140
186141
187142
188143
189144
190145
191146
192147
193148
194149
195150
196151
197152
198153
199154
200155
201156
202157
203158
204159
205160
206161
207162
208163
209164
210165
211166
212167
213168
214169
215170
216171
217172
218173
219174
220175
221176
222177
223178
224179
225180
226181
227182
228183
229184
230185
231186
232187
233188
234189
235190
236191
237192
238193
239194
240195
241196
242197
243198
244199
245200
246201
247202
248203
249204
250205
251206
252207
253208
254209
255210
256211
257212
258213
259214
260215
261216
262217
263218
264219
265220
266221
267222
268223
269224
270225
271226
272227
273228
274229
275230
276231
277232
278233
279234
280235
281236
282237
283238
284239
285240
286241
287242
288243
289244
290245
291246
292247
293248
294249
295250
296251
297252
298253
299254
300255
301256
302257
303258
304259
305260
306261
307262
308263
309264
310265
311266
312267
313268
314269
315270
316271
317272
318273
319274
320275
321276
322277
323278
324279
325280
326281
327282
328283
329284
330285
331286
332287
333288
334289
335290
336291
337292
338293
339294
340295
341296
342297
343298
344299
345300
346301
347302
348303
349304
350305
351306
352307
353308
354309
355310
356311
357312
358313
359314
360315
361316
362317
363318
364319
365320
366321
367322
368323
369324
370325
371326
372327
373328
374329
375330
376331
377332
378333
379334
380335
381336
382337
383338
384339
385340
386341
387342
388343
389344
390345
391346
392347
393348
394349
395350
396351
397352
398353
399354
400355
401356
402357
403358
404359
405360
406361
407362
408363
409364
410365
411366
412367
413368
414369
415370
416371
417372
418373
419374
420375
421376
422377
423378
424379
425380
426381
427382
428383
429384
430385
431386
432387
433388
434389
435390
436391
437392
438393
439394
440395
441396
442397
443398
444399
445400
446401
447402
448403
449404
450405
451406
452407
453408
454409
455410
456411
457412
458413
459414
460415
461416
462417
463418
464419
465420
466421
467422
468423
469424
470425
471426
472427
473428
474429
475430
476431
477432
478433
479434
480435
481436
482437
483438
484439
485440
486441
487442
488443
489444
490445
491446
492447
493448
494449
495450
496451
497452
498453
499454
500455
501456
502457
503458
504459
505460
506461
507462
508463</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
509<span class="cline-any cline-neutral">&nbsp;</span>
510<span class="cline-any cline-yes"></span>
511<span class="cline-any cline-neutral">&nbsp;</span>
512<span class="cline-any cline-yes"></span>
513<span class="cline-any cline-yes"></span>
514<span class="cline-any cline-yes"></span>
515<span class="cline-any cline-yes"></span>
516<span class="cline-any cline-yes"></span>
517<span class="cline-any cline-yes"></span>
518<span class="cline-any cline-yes"></span>
519<span class="cline-any cline-yes"></span>
520<span class="cline-any cline-neutral">&nbsp;</span>
521<span class="cline-any cline-neutral">&nbsp;</span>
522<span class="cline-any cline-neutral">&nbsp;</span>
523<span class="cline-any cline-neutral">&nbsp;</span>
524<span class="cline-any cline-neutral">&nbsp;</span>
525<span class="cline-any cline-neutral">&nbsp;</span>
526<span class="cline-any cline-neutral">&nbsp;</span>
527<span class="cline-any cline-neutral">&nbsp;</span>
528<span class="cline-any cline-neutral">&nbsp;</span>
529<span class="cline-any cline-neutral">&nbsp;</span>
530<span class="cline-any cline-neutral">&nbsp;</span>
531<span class="cline-any cline-neutral">&nbsp;</span>
532<span class="cline-any cline-neutral">&nbsp;</span>
533<span class="cline-any cline-yes">78×</span>
534<span class="cline-any cline-yes">78×</span>
535<span class="cline-any cline-yes">78×</span>
536<span class="cline-any cline-neutral">&nbsp;</span>
537<span class="cline-any cline-neutral">&nbsp;</span>
538<span class="cline-any cline-neutral">&nbsp;</span>
539<span class="cline-any cline-neutral">&nbsp;</span>
540<span class="cline-any cline-neutral">&nbsp;</span>
541<span class="cline-any cline-neutral">&nbsp;</span>
542<span class="cline-any cline-neutral">&nbsp;</span>
543<span class="cline-any cline-neutral">&nbsp;</span>
544<span class="cline-any cline-neutral">&nbsp;</span>
545<span class="cline-any cline-yes"></span>
546<span class="cline-any cline-neutral">&nbsp;</span>
547<span class="cline-any cline-neutral">&nbsp;</span>
548<span class="cline-any cline-neutral">&nbsp;</span>
549<span class="cline-any cline-neutral">&nbsp;</span>
550<span class="cline-any cline-neutral">&nbsp;</span>
551<span class="cline-any cline-neutral">&nbsp;</span>
552<span class="cline-any cline-neutral">&nbsp;</span>
553<span class="cline-any cline-neutral">&nbsp;</span>
554<span class="cline-any cline-neutral">&nbsp;</span>
555<span class="cline-any cline-yes">11×</span>
556<span class="cline-any cline-neutral">&nbsp;</span>
557<span class="cline-any cline-neutral">&nbsp;</span>
558<span class="cline-any cline-neutral">&nbsp;</span>
559<span class="cline-any cline-neutral">&nbsp;</span>
560<span class="cline-any cline-neutral">&nbsp;</span>
561<span class="cline-any cline-neutral">&nbsp;</span>
562<span class="cline-any cline-neutral">&nbsp;</span>
563<span class="cline-any cline-neutral">&nbsp;</span>
564<span class="cline-any cline-neutral">&nbsp;</span>
565<span class="cline-any cline-neutral">&nbsp;</span>
566<span class="cline-any cline-yes">140×</span>
567<span class="cline-any cline-yes">137×</span>
568<span class="cline-any cline-neutral">&nbsp;</span>
569<span class="cline-any cline-yes"></span>
570<span class="cline-any cline-neutral">&nbsp;</span>
571<span class="cline-any cline-neutral">&nbsp;</span>
572<span class="cline-any cline-yes">140×</span>
573<span class="cline-any cline-yes">140×</span>
574<span class="cline-any cline-yes">140×</span>
575<span class="cline-any cline-yes">140×</span>
576<span class="cline-any cline-neutral">&nbsp;</span>
577<span class="cline-any cline-neutral">&nbsp;</span>
578<span class="cline-any cline-neutral">&nbsp;</span>
579<span class="cline-any cline-neutral">&nbsp;</span>
580<span class="cline-any cline-neutral">&nbsp;</span>
581<span class="cline-any cline-neutral">&nbsp;</span>
582<span class="cline-any cline-neutral">&nbsp;</span>
583<span class="cline-any cline-neutral">&nbsp;</span>
584<span class="cline-any cline-neutral">&nbsp;</span>
585<span class="cline-any cline-yes">279×</span>
586<span class="cline-any cline-neutral">&nbsp;</span>
587<span class="cline-any cline-neutral">&nbsp;</span>
588<span class="cline-any cline-neutral">&nbsp;</span>
589<span class="cline-any cline-neutral">&nbsp;</span>
590<span class="cline-any cline-neutral">&nbsp;</span>
591<span class="cline-any cline-neutral">&nbsp;</span>
592<span class="cline-any cline-neutral">&nbsp;</span>
593<span class="cline-any cline-neutral">&nbsp;</span>
594<span class="cline-any cline-neutral">&nbsp;</span>
595<span class="cline-any cline-yes"></span>
596<span class="cline-any cline-yes"></span>
597<span class="cline-any cline-yes"></span>
598<span class="cline-any cline-yes"></span>
599<span class="cline-any cline-yes"></span>
600<span class="cline-any cline-yes"></span>
601<span class="cline-any cline-yes"></span>
602<span class="cline-any cline-yes"></span>
603<span class="cline-any cline-neutral">&nbsp;</span>
604<span class="cline-any cline-neutral">&nbsp;</span>
605<span class="cline-any cline-yes"></span>
606<span class="cline-any cline-neutral">&nbsp;</span>
607<span class="cline-any cline-neutral">&nbsp;</span>
608<span class="cline-any cline-neutral">&nbsp;</span>
609<span class="cline-any cline-neutral">&nbsp;</span>
610<span class="cline-any cline-neutral">&nbsp;</span>
611<span class="cline-any cline-neutral">&nbsp;</span>
612<span class="cline-any cline-neutral">&nbsp;</span>
613<span class="cline-any cline-neutral">&nbsp;</span>
614<span class="cline-any cline-neutral">&nbsp;</span>
615<span class="cline-any cline-neutral">&nbsp;</span>
616<span class="cline-any cline-neutral">&nbsp;</span>
617<span class="cline-any cline-neutral">&nbsp;</span>
618<span class="cline-any cline-yes">24×</span>
619<span class="cline-any cline-yes">24×</span>
620<span class="cline-any cline-yes">24×</span>
621<span class="cline-any cline-neutral">&nbsp;</span>
622<span class="cline-any cline-yes">24×</span>
623<span class="cline-any cline-yes">37×</span>
624<span class="cline-any cline-yes">46×</span>
625<span class="cline-any cline-neutral">&nbsp;</span>
626<span class="cline-any cline-yes">24×</span>
627<span class="cline-any cline-yes">24×</span>
628<span class="cline-any cline-neutral">&nbsp;</span>
629<span class="cline-any cline-neutral">&nbsp;</span>
630<span class="cline-any cline-neutral">&nbsp;</span>
631<span class="cline-any cline-neutral">&nbsp;</span>
632<span class="cline-any cline-neutral">&nbsp;</span>
633<span class="cline-any cline-neutral">&nbsp;</span>
634<span class="cline-any cline-neutral">&nbsp;</span>
635<span class="cline-any cline-neutral">&nbsp;</span>
636<span class="cline-any cline-neutral">&nbsp;</span>
637<span class="cline-any cline-neutral">&nbsp;</span>
638<span class="cline-any cline-neutral">&nbsp;</span>
639<span class="cline-any cline-neutral">&nbsp;</span>
640<span class="cline-any cline-yes">15×</span>
641<span class="cline-any cline-yes">15×</span>
642<span class="cline-any cline-yes">15×</span>
643<span class="cline-any cline-yes">14×</span>
644<span class="cline-any cline-yes">14×</span>
645<span class="cline-any cline-neutral">&nbsp;</span>
646<span class="cline-any cline-yes">14×</span>
647<span class="cline-any cline-yes">11×</span>
648<span class="cline-any cline-neutral">&nbsp;</span>
649<span class="cline-any cline-yes"></span>
650<span class="cline-any cline-yes"></span>
651<span class="cline-any cline-neutral">&nbsp;</span>
652<span class="cline-any cline-neutral">&nbsp;</span>
653<span class="cline-any cline-yes"></span>
654<span class="cline-any cline-neutral">&nbsp;</span>
655<span class="cline-any cline-neutral">&nbsp;</span>
656<span class="cline-any cline-neutral">&nbsp;</span>
657<span class="cline-any cline-neutral">&nbsp;</span>
658<span class="cline-any cline-neutral">&nbsp;</span>
659<span class="cline-any cline-neutral">&nbsp;</span>
660<span class="cline-any cline-neutral">&nbsp;</span>
661<span class="cline-any cline-neutral">&nbsp;</span>
662<span class="cline-any cline-neutral">&nbsp;</span>
663<span class="cline-any cline-neutral">&nbsp;</span>
664<span class="cline-any cline-neutral">&nbsp;</span>
665<span class="cline-any cline-neutral">&nbsp;</span>
666<span class="cline-any cline-neutral">&nbsp;</span>
667<span class="cline-any cline-neutral">&nbsp;</span>
668<span class="cline-any cline-neutral">&nbsp;</span>
669<span class="cline-any cline-yes">27×</span>
670<span class="cline-any cline-yes">27×</span>
671<span class="cline-any cline-neutral">&nbsp;</span>
672<span class="cline-any cline-neutral">&nbsp;</span>
673<span class="cline-any cline-neutral">&nbsp;</span>
674<span class="cline-any cline-neutral">&nbsp;</span>
675<span class="cline-any cline-neutral">&nbsp;</span>
676<span class="cline-any cline-neutral">&nbsp;</span>
677<span class="cline-any cline-neutral">&nbsp;</span>
678<span class="cline-any cline-neutral">&nbsp;</span>
679<span class="cline-any cline-neutral">&nbsp;</span>
680<span class="cline-any cline-neutral">&nbsp;</span>
681<span class="cline-any cline-neutral">&nbsp;</span>
682<span class="cline-any cline-yes">74×</span>
683<span class="cline-any cline-yes">74×</span>
684<span class="cline-any cline-yes">72×</span>
685<span class="cline-any cline-yes">72×</span>
686<span class="cline-any cline-neutral">&nbsp;</span>
687<span class="cline-any cline-yes">70×</span>
688<span class="cline-any cline-yes">70×</span>
689<span class="cline-any cline-neutral">&nbsp;</span>
690<span class="cline-any cline-neutral">&nbsp;</span>
691<span class="cline-any cline-neutral">&nbsp;</span>
692<span class="cline-any cline-neutral">&nbsp;</span>
693<span class="cline-any cline-neutral">&nbsp;</span>
694<span class="cline-any cline-neutral">&nbsp;</span>
695<span class="cline-any cline-neutral">&nbsp;</span>
696<span class="cline-any cline-neutral">&nbsp;</span>
697<span class="cline-any cline-neutral">&nbsp;</span>
698<span class="cline-any cline-yes"></span>
699<span class="cline-any cline-yes"></span>
700<span class="cline-any cline-yes"></span>
701<span class="cline-any cline-yes"></span>
702<span class="cline-any cline-neutral">&nbsp;</span>
703<span class="cline-any cline-yes"></span>
704<span class="cline-any cline-yes"></span>
705<span class="cline-any cline-neutral">&nbsp;</span>
706<span class="cline-any cline-neutral">&nbsp;</span>
707<span class="cline-any cline-neutral">&nbsp;</span>
708<span class="cline-any cline-neutral">&nbsp;</span>
709<span class="cline-any cline-neutral">&nbsp;</span>
710<span class="cline-any cline-neutral">&nbsp;</span>
711<span class="cline-any cline-neutral">&nbsp;</span>
712<span class="cline-any cline-neutral">&nbsp;</span>
713<span class="cline-any cline-neutral">&nbsp;</span>
714<span class="cline-any cline-neutral">&nbsp;</span>
715<span class="cline-any cline-neutral">&nbsp;</span>
716<span class="cline-any cline-neutral">&nbsp;</span>
717<span class="cline-any cline-neutral">&nbsp;</span>
718<span class="cline-any cline-yes">12×</span>
719<span class="cline-any cline-yes">12×</span>
720<span class="cline-any cline-yes">12×</span>
721<span class="cline-any cline-yes">12×</span>
722<span class="cline-any cline-neutral">&nbsp;</span>
723<span class="cline-any cline-yes">12×</span>
724<span class="cline-any cline-neutral">&nbsp;</span>
725<span class="cline-any cline-neutral">&nbsp;</span>
726<span class="cline-any cline-neutral">&nbsp;</span>
727<span class="cline-any cline-yes">12×</span>
728<span class="cline-any cline-yes">23×</span>
729<span class="cline-any cline-neutral">&nbsp;</span>
730<span class="cline-any cline-neutral">&nbsp;</span>
731<span class="cline-any cline-neutral">&nbsp;</span>
732<span class="cline-any cline-neutral">&nbsp;</span>
733<span class="cline-any cline-neutral">&nbsp;</span>
734<span class="cline-any cline-neutral">&nbsp;</span>
735<span class="cline-any cline-neutral">&nbsp;</span>
736<span class="cline-any cline-neutral">&nbsp;</span>
737<span class="cline-any cline-neutral">&nbsp;</span>
738<span class="cline-any cline-neutral">&nbsp;</span>
739<span class="cline-any cline-neutral">&nbsp;</span>
740<span class="cline-any cline-neutral">&nbsp;</span>
741<span class="cline-any cline-neutral">&nbsp;</span>
742<span class="cline-any cline-neutral">&nbsp;</span>
743<span class="cline-any cline-yes">14×</span>
744<span class="cline-any cline-neutral">&nbsp;</span>
745<span class="cline-any cline-neutral">&nbsp;</span>
746<span class="cline-any cline-neutral">&nbsp;</span>
747<span class="cline-any cline-neutral">&nbsp;</span>
748<span class="cline-any cline-neutral">&nbsp;</span>
749<span class="cline-any cline-neutral">&nbsp;</span>
750<span class="cline-any cline-neutral">&nbsp;</span>
751<span class="cline-any cline-neutral">&nbsp;</span>
752<span class="cline-any cline-neutral">&nbsp;</span>
753<span class="cline-any cline-neutral">&nbsp;</span>
754<span class="cline-any cline-yes">13×</span>
755<span class="cline-any cline-yes">13×</span>
756<span class="cline-any cline-yes">11×</span>
757<span class="cline-any cline-yes">11×</span>
758<span class="cline-any cline-neutral">&nbsp;</span>
759<span class="cline-any cline-yes"></span>
760<span class="cline-any cline-yes"></span>
761<span class="cline-any cline-neutral">&nbsp;</span>
762<span class="cline-any cline-neutral">&nbsp;</span>
763<span class="cline-any cline-neutral">&nbsp;</span>
764<span class="cline-any cline-neutral">&nbsp;</span>
765<span class="cline-any cline-neutral">&nbsp;</span>
766<span class="cline-any cline-neutral">&nbsp;</span>
767<span class="cline-any cline-neutral">&nbsp;</span>
768<span class="cline-any cline-neutral">&nbsp;</span>
769<span class="cline-any cline-neutral">&nbsp;</span>
770<span class="cline-any cline-yes"></span>
771<span class="cline-any cline-yes"></span>
772<span class="cline-any cline-yes"></span>
773<span class="cline-any cline-yes"></span>
774<span class="cline-any cline-neutral">&nbsp;</span>
775<span class="cline-any cline-yes"></span>
776<span class="cline-any cline-yes"></span>
777<span class="cline-any cline-neutral">&nbsp;</span>
778<span class="cline-any cline-neutral">&nbsp;</span>
779<span class="cline-any cline-neutral">&nbsp;</span>
780<span class="cline-any cline-neutral">&nbsp;</span>
781<span class="cline-any cline-neutral">&nbsp;</span>
782<span class="cline-any cline-neutral">&nbsp;</span>
783<span class="cline-any cline-neutral">&nbsp;</span>
784<span class="cline-any cline-neutral">&nbsp;</span>
785<span class="cline-any cline-neutral">&nbsp;</span>
786<span class="cline-any cline-neutral">&nbsp;</span>
787<span class="cline-any cline-neutral">&nbsp;</span>
788<span class="cline-any cline-neutral">&nbsp;</span>
789<span class="cline-any cline-neutral">&nbsp;</span>
790<span class="cline-any cline-yes"></span>
791<span class="cline-any cline-yes"></span>
792<span class="cline-any cline-yes"></span>
793<span class="cline-any cline-yes"></span>
794<span class="cline-any cline-neutral">&nbsp;</span>
795<span class="cline-any cline-yes"></span>
796<span class="cline-any cline-neutral">&nbsp;</span>
797<span class="cline-any cline-neutral">&nbsp;</span>
798<span class="cline-any cline-neutral">&nbsp;</span>
799<span class="cline-any cline-yes"></span>
800<span class="cline-any cline-yes"></span>
801<span class="cline-any cline-neutral">&nbsp;</span>
802<span class="cline-any cline-neutral">&nbsp;</span>
803<span class="cline-any cline-neutral">&nbsp;</span>
804<span class="cline-any cline-neutral">&nbsp;</span>
805<span class="cline-any cline-neutral">&nbsp;</span>
806<span class="cline-any cline-neutral">&nbsp;</span>
807<span class="cline-any cline-neutral">&nbsp;</span>
808<span class="cline-any cline-neutral">&nbsp;</span>
809<span class="cline-any cline-yes">38×</span>
810<span class="cline-any cline-neutral">&nbsp;</span>
811<span class="cline-any cline-neutral">&nbsp;</span>
812<span class="cline-any cline-neutral">&nbsp;</span>
813<span class="cline-any cline-neutral">&nbsp;</span>
814<span class="cline-any cline-neutral">&nbsp;</span>
815<span class="cline-any cline-neutral">&nbsp;</span>
816<span class="cline-any cline-neutral">&nbsp;</span>
817<span class="cline-any cline-neutral">&nbsp;</span>
818<span class="cline-any cline-yes"></span>
819<span class="cline-any cline-yes"></span>
820<span class="cline-any cline-yes"></span>
821<span class="cline-any cline-yes"></span>
822<span class="cline-any cline-yes"></span>
823<span class="cline-any cline-yes"></span>
824<span class="cline-any cline-neutral">&nbsp;</span>
825<span class="cline-any cline-neutral">&nbsp;</span>
826<span class="cline-any cline-neutral">&nbsp;</span>
827<span class="cline-any cline-neutral">&nbsp;</span>
828<span class="cline-any cline-neutral">&nbsp;</span>
829<span class="cline-any cline-neutral">&nbsp;</span>
830<span class="cline-any cline-neutral">&nbsp;</span>
831<span class="cline-any cline-neutral">&nbsp;</span>
832<span class="cline-any cline-yes"></span>
833<span class="cline-any cline-yes"></span>
834<span class="cline-any cline-yes"></span>
835<span class="cline-any cline-yes"></span>
836<span class="cline-any cline-yes"></span>
837<span class="cline-any cline-neutral">&nbsp;</span>
838<span class="cline-any cline-yes"></span>
839<span class="cline-any cline-yes"></span>
840<span class="cline-any cline-yes"></span>
841<span class="cline-any cline-yes"></span>
842<span class="cline-any cline-yes">12×</span>
843<span class="cline-any cline-neutral">&nbsp;</span>
844<span class="cline-any cline-neutral">&nbsp;</span>
845<span class="cline-any cline-yes"></span>
846<span class="cline-any cline-yes">28×</span>
847<span class="cline-any cline-yes">10×</span>
848<span class="cline-any cline-neutral">&nbsp;</span>
849<span class="cline-any cline-yes"></span>
850<span class="cline-any cline-neutral">&nbsp;</span>
851<span class="cline-any cline-neutral">&nbsp;</span>
852<span class="cline-any cline-neutral">&nbsp;</span>
853<span class="cline-any cline-neutral">&nbsp;</span>
854<span class="cline-any cline-neutral">&nbsp;</span>
855<span class="cline-any cline-neutral">&nbsp;</span>
856<span class="cline-any cline-yes"></span>
857<span class="cline-any cline-yes"></span>
858<span class="cline-any cline-yes"></span>
859<span class="cline-any cline-yes"></span>
860<span class="cline-any cline-yes"></span>
861<span class="cline-any cline-yes"></span>
862<span class="cline-any cline-yes"></span>
863<span class="cline-any cline-yes"></span>
864<span class="cline-any cline-yes"></span>
865<span class="cline-any cline-neutral">&nbsp;</span>
866<span class="cline-any cline-neutral">&nbsp;</span>
867<span class="cline-any cline-yes"></span>
868<span class="cline-any cline-yes"></span>
869<span class="cline-any cline-yes"></span>
870<span class="cline-any cline-yes"></span>
871<span class="cline-any cline-yes"></span>
872<span class="cline-any cline-yes"></span>
873<span class="cline-any cline-neutral">&nbsp;</span>
874<span class="cline-any cline-yes"></span>
875<span class="cline-any cline-neutral">&nbsp;</span>
876<span class="cline-any cline-neutral">&nbsp;</span>
877<span class="cline-any cline-neutral">&nbsp;</span>
878<span class="cline-any cline-neutral">&nbsp;</span>
879<span class="cline-any cline-neutral">&nbsp;</span>
880<span class="cline-any cline-neutral">&nbsp;</span>
881<span class="cline-any cline-neutral">&nbsp;</span>
882<span class="cline-any cline-neutral">&nbsp;</span>
883<span class="cline-any cline-neutral">&nbsp;</span>
884<span class="cline-any cline-yes"></span>
885<span class="cline-any cline-yes"></span>
886<span class="cline-any cline-yes"></span>
887<span class="cline-any cline-neutral">&nbsp;</span>
888<span class="cline-any cline-neutral">&nbsp;</span>
889<span class="cline-any cline-yes"></span>
890<span class="cline-any cline-neutral">&nbsp;</span>
891<span class="cline-any cline-yes"></span>
892<span class="cline-any cline-yes"></span>
893<span class="cline-any cline-neutral">&nbsp;</span>
894<span class="cline-any cline-neutral">&nbsp;</span>
895<span class="cline-any cline-neutral">&nbsp;</span>
896<span class="cline-any cline-neutral">&nbsp;</span>
897<span class="cline-any cline-neutral">&nbsp;</span>
898<span class="cline-any cline-neutral">&nbsp;</span>
899<span class="cline-any cline-neutral">&nbsp;</span>
900<span class="cline-any cline-neutral">&nbsp;</span>
901<span class="cline-any cline-neutral">&nbsp;</span>
902<span class="cline-any cline-neutral">&nbsp;</span>
903<span class="cline-any cline-yes"></span>
904<span class="cline-any cline-yes"></span>
905<span class="cline-any cline-yes"></span>
906<span class="cline-any cline-yes"></span>
907<span class="cline-any cline-yes"></span>
908<span class="cline-any cline-neutral">&nbsp;</span>
909<span class="cline-any cline-neutral">&nbsp;</span>
910<span class="cline-any cline-neutral">&nbsp;</span>
911<span class="cline-any cline-neutral">&nbsp;</span>
912<span class="cline-any cline-neutral">&nbsp;</span>
913<span class="cline-any cline-neutral">&nbsp;</span>
914<span class="cline-any cline-neutral">&nbsp;</span>
915<span class="cline-any cline-neutral">&nbsp;</span>
916<span class="cline-any cline-neutral">&nbsp;</span>
917<span class="cline-any cline-neutral">&nbsp;</span>
918<span class="cline-any cline-yes"></span>
919<span class="cline-any cline-yes"></span>
920<span class="cline-any cline-yes"></span>
921<span class="cline-any cline-yes"></span>
922<span class="cline-any cline-neutral">&nbsp;</span>
923<span class="cline-any cline-yes"></span>
924<span class="cline-any cline-yes"></span>
925<span class="cline-any cline-yes"></span>
926<span class="cline-any cline-yes"></span>
927<span class="cline-any cline-neutral">&nbsp;</span>
928<span class="cline-any cline-neutral">&nbsp;</span>
929<span class="cline-any cline-yes"></span>
930<span class="cline-any cline-yes"></span>
931<span class="cline-any cline-yes"></span>
932<span class="cline-any cline-neutral">&nbsp;</span>
933<span class="cline-any cline-neutral">&nbsp;</span>
934<span class="cline-any cline-yes"></span>
935<span class="cline-any cline-yes"></span>
936<span class="cline-any cline-neutral">&nbsp;</span>
937<span class="cline-any cline-neutral">&nbsp;</span>
938<span class="cline-any cline-neutral">&nbsp;</span>
939<span class="cline-any cline-neutral">&nbsp;</span>
940<span class="cline-any cline-yes"></span>
941<span class="cline-any cline-neutral">&nbsp;</span>
942<span class="cline-any cline-neutral">&nbsp;</span>
943<span class="cline-any cline-neutral">&nbsp;</span>
944<span class="cline-any cline-neutral">&nbsp;</span>
945<span class="cline-any cline-neutral">&nbsp;</span>
946<span class="cline-any cline-neutral">&nbsp;</span>
947<span class="cline-any cline-neutral">&nbsp;</span>
948<span class="cline-any cline-yes"></span>
949<span class="cline-any cline-yes">304×</span>
950<span class="cline-any cline-neutral">&nbsp;</span>
951<span class="cline-any cline-neutral">&nbsp;</span>
952<span class="cline-any cline-neutral">&nbsp;</span>
953<span class="cline-any cline-neutral">&nbsp;</span>
954<span class="cline-any cline-neutral">&nbsp;</span>
955<span class="cline-any cline-neutral">&nbsp;</span>
956<span class="cline-any cline-neutral">&nbsp;</span>
957<span class="cline-any cline-neutral">&nbsp;</span>
958<span class="cline-any cline-neutral">&nbsp;</span>
959<span class="cline-any cline-yes"></span>
960<span class="cline-any cline-yes">37×</span>
961<span class="cline-any cline-yes"></span>
962<span class="cline-any cline-neutral">&nbsp;</span>
963<span class="cline-any cline-neutral">&nbsp;</span>
964<span class="cline-any cline-yes">35×</span>
965<span class="cline-any cline-yes"></span>
966<span class="cline-any cline-neutral">&nbsp;</span>
967<span class="cline-any cline-neutral">&nbsp;</span>
968<span class="cline-any cline-yes">33×</span>
969<span class="cline-any cline-neutral">&nbsp;</span>
970<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">'use strict'
971&nbsp;
972require('babel-polyfill-safer')
973&nbsp;
974let assert = require('assert')
975let bytes = require('bytes')
976let debug = require('debug')('mako-tree')
977let File = require('./file')
978let iso = require('regex-iso-date')()
979let Graph = require('graph.js/dist/graph.js')
980let toposort = require('graph-toposort')
981let utils = require('mako-utils')
982&nbsp;
983/**
984 * Represents a dependency graph for the builder.
985 *
986 * @class
987 */
988class Tree {
989 /**
990 * Creates a new instance, particularly creating the Graph instance.
991 *
992 * @param {String} root The optional project root. (default: pwd)
993 */
994 constructor (root) {
995 debug('initialize')
996 this.root = root || process.cwd()
997 this.graph = new Graph()
998 }
999&nbsp;
1000 /**
1001 * Implement the iterator interface to allow iterating the files in this
1002 * tree topologically.
1003 *
1004 * TODO: allow configuring the iteration order (ie: turn topological off)
1005 */
1006 [Symbol.iterator] () {
1007 return this.getFiles({ topological: true }).values()
1008 }
1009&nbsp;
1010 /**
1011 * Checks to see if the given file ID exists in the tree.
1012 *
1013 * @param {String} file The file or string ID.
1014 * @return {Boolean} has
1015 */
1016 hasFile (file) {
1017 return this.graph.hasVertex(id(file))
1018 }
1019&nbsp;
1020 /**
1021 * Adds the file with the given `params` to the tree. If a file with that
1022 * path already exists in the tree, that is returned instead.
1023 *
1024 * @param {Object} params The vinyl params for this file.
1025 * @return {File} file
1026 */
1027 addFile (params) {
1028 if (typeof params === 'string') {
1029 params = { base: this.root, path: params }
1030 } else {
1031 params.base = this.root
1032 }
1033&nbsp;
1034 let file = new File(params, this)
1035 debug('adding file: %s', utils.relative(file.path))
1036 this.graph.addNewVertex(file.id, file)
1037 return file
1038 }
1039&nbsp;
1040 /**
1041 * Returns the `File` with the given `id`.
1042 *
1043 * @param {String} file The file ID.
1044 * @return {File} file
1045 */
1046 getFile (file) {
1047 return this.graph.vertexValue(file)
1048 }
1049&nbsp;
1050 /**
1051 * Iterates through the files looking for one that matches the input path.
1052 *
1053 * @param {String} file The path to search for.
1054 * @return {File} file
1055 */
1056 findFile (file) {
1057 let timer = utils.timer()
1058 let path = typeof file === 'string' ? file : file.path
1059 debug('searching for file with path %s', utils.relative(path))
1060 for (let vertex of this.graph.vertices()) {
1061 let file = vertex[1]
1062 if (file.hasPath(path)) {
1063 debug('match found: %s (took %s)', utils.relative(file.path), timer())
1064 return file
1065 }
1066 }
1067 debug('file not found (took %s)', timer())
1068 }
1069&nbsp;
1070 /**
1071 * Retrieve a list of file paths based on the given criteria.
1072 *
1073 * Available `options`:
1074 * - `topological` sort the files topologically
1075 *
1076 * @param {Object} options The optional filter criteria.
1077 * @return {Array} files
1078 */
1079 getFiles (options) {
1080 let timer = utils.timer()
1081 let topological = options ? !!options.topological : false
1082 debug('getting %d files: (topological: %j)', this.size(), topological)
1083&nbsp;
1084 let files = topological
1085 ? toposort(this.graph).map(id =&gt; this.getFile(id))
1086 : Array.from(this.graph.vertices()).map(v =&gt; v[1])
1087&nbsp;
1088 debug('finished getting %d files (took %s)', files.length, timer())
1089 return files
1090 }
1091&nbsp;
1092 /**
1093 * Remove the file with the given `id` from the graph.
1094 *
1095 * Available `options`:
1096 * - `force` removes the file even if dependencies/dependants exist
1097 *
1098 * @param {String} node The file or string ID.
1099 * @param {Object} options Additional options.
1100 */
1101 removeFile (node, options) {
1102 let force = options ? !!options.force : false
1103 let file = this.getFile(id(node))
1104 assert(file, `cannot find file ${node} in this tree`)
1105 const relative = utils.relative(file.path)
1106 debug('removing file %s: (force: %j)', relative, force)
1107&nbsp;
1108 if (force) {
1109 this.graph.destroyVertex(file.id)
1110 } else {
1111 if (this.graph.degree(file.id) &gt; 0) {
1112 throw new Error(`cannot remove ${relative} while it still has dependencies in the tree (use force: true to override this)`)
1113 }
1114&nbsp;
1115 this.graph.removeVertex(file.id)
1116 }
1117 }
1118&nbsp;
1119 /**
1120 * Checks to see if the given `parent` has a link to dependency `child`.
1121 *
1122 * Available `options`:
1123 * - `recursive`: check for the dependency recursively
1124 *
1125 * @param {String} parent The parent file (or it's string ID).
1126 * @param {String} child The child file (or it's string ID).
1127 * @param {Object} options Additional options.
1128 * @return {Boolean} has
1129 */
1130 hasDependency (parent, child, options) {
1131 let recursive = options ? !!options.recursive : false
1132 return recursive
1133 ? this.graph.hasPath(id(child), id(parent))
1134 : this.graph.hasEdge(id(child), id(parent))
1135 }
1136&nbsp;
1137 /**
1138 * Sets up the file `child` as a dependency of `parent`.
1139 *
1140 * @param {String} parent The parent file (or it's string ID).
1141 * @param {String} child The child file (or it's string ID).
1142 */
1143 addDependency (parent, child) {
1144 let childFile = this.getFile(id(child))
1145 assert(childFile, `cannot add dependency because ${child} is not in the tree`)
1146 let parentFile = this.getFile(id(parent))
1147 assert(parentFile, `cannot add dependency because ${parent} is not in the tree`)
1148&nbsp;
1149 this.graph.addEdge(childFile.id, parentFile.id)
1150 debug('added dependency %s -&gt; %s', utils.relative(childFile.path), utils.relative(parentFile.path))
1151 }
1152&nbsp;
1153 /**
1154 * Removes the dependency `child` from the `parent` file.
1155 *
1156 * @param {String} parent The parent file (or it's string ID).
1157 * @param {String} child The child file (or it's string ID).
1158 */
1159 removeDependency (parent, child) {
1160 let childFile = this.getFile(id(child))
1161 assert(childFile, `cannot remove dependency because ${child} is not in the tree`)
1162 let parentFile = this.getFile(id(parent))
1163 assert(parentFile, `cannot remove dependency because ${parent} is not in the tree`)
1164&nbsp;
1165 this.graph.removeEdge(childFile.id, parentFile.id)
1166 debug('removed dependency %s -&gt; %s', utils.relative(childFile.path), utils.relative(parentFile.path))
1167 }
1168&nbsp;
1169 /**
1170 * Return a list of all files that the given `node` file depends on.
1171 *
1172 * Available `options`:
1173 * - `recursive` when set, go recursively down the entire graph
1174 *
1175 * @param {String} node The parent file (or it's string ID).
1176 * @param {Object} options Optional search criteria.
1177 * @return {Array} files
1178 */
1179 dependenciesOf (node, options) {
1180 let timer = utils.timer()
1181 let recursive = options ? !!options.recursive : false
1182 let file = this.getFile(id(node))
1183 debug('getting dependencies of %s: (recursive: %j)', utils.relative(file.path), recursive)
1184&nbsp;
1185 let deps = recursive
1186 ? Array.from(this.graph.verticesWithPathTo(file.id))
1187 : Array.from(this.graph.verticesTo(file.id))
1188&nbsp;
1189 debug('%d dependencies found (took %s)', deps.length, timer())
1190 return deps.map(v =&gt; v[1])
1191 }
1192&nbsp;
1193 /**
1194 * Checks to see if the given `child` has a link to dependant `parent`.
1195 *
1196 * Available `options`:
1197 * - `recursive` looks for the dependant recursively.
1198 *
1199 * @param {String} child The child file (or it's string ID).
1200 * @param {String} parent The parent file (or it's string ID).
1201 * @param {Object} options Additional options.
1202 * @return {Boolean} has
1203 */
1204 hasDependant (child, parent, options) {
1205 return this.hasDependency(parent, child, options)
1206 }
1207&nbsp;
1208 /**
1209 * Sets up the given `parent` as a dependant of `child`. In other words,
1210 * the reverse of addDependency()
1211 *
1212 * @param {String} child The child file (or it's string ID).
1213 * @param {String} parent The parent file (or it's string ID).
1214 */
1215 addDependant (child, parent) {
1216 let childFile = this.getFile(id(child))
1217 assert(childFile, `cannot add dependant because ${child} is not in the tree`)
1218 let parentFile = this.getFile(id(parent))
1219 assert(parentFile, `cannot add dependant because ${parent} is not in the tree`)
1220&nbsp;
1221 this.graph.addEdge(childFile.id, parentFile.id)
1222 debug('added dependant %s &lt;- %s', utils.relative(childFile.path), utils.relative(parentFile.path))
1223 }
1224&nbsp;
1225 /**
1226 * Removes the dependant `parent` from the `child` file.
1227 *
1228 * @param {String} child The child file (or it's string ID).
1229 * @param {String} parent The parent file (or it's string ID).
1230 */
1231 removeDependant (child, parent) {
1232 let childFile = this.getFile(id(child))
1233 assert(childFile, `cannot remove dependant because ${child} is not in the tree`)
1234 let parentFile = this.getFile(id(parent))
1235 assert(parentFile, `cannot remove dependant because ${parent} is not in the tree`)
1236&nbsp;
1237 this.graph.removeEdge(childFile.id, parentFile.id)
1238 debug('removed dependant %s &lt;- %s', utils.relative(childFile.path), utils.relative(parentFile.path))
1239 }
1240&nbsp;
1241 /**
1242 * Return a list of all files that depend on the given `node` file.
1243 *
1244 * Available `options`:
1245 * - `recursive` when set, go recursively down the entire graph
1246 *
1247 * @param {String} node The child file (or it's string ID).
1248 * @param {Object} options The search criteria.
1249 * @return {Array} files
1250 */
1251 dependantsOf (node, options) {
1252 let timer = utils.timer()
1253 let recursive = options ? !!options.recursive : false
1254 let file = this.getFile(id(node))
1255 debug('getting dependants of %s: (recursive: %j)', utils.relative(file.path), recursive)
1256&nbsp;
1257 let deps = recursive
1258 ? Array.from(this.graph.verticesWithPathFrom(id(file)))
1259 : Array.from(this.graph.verticesFrom(id(file)))
1260&nbsp;
1261 debug('%d dependants found (took %s)', deps.length, timer())
1262 return deps.map(v =&gt; v[1])
1263 }
1264&nbsp;
1265 /**
1266 * Tells us how many files are in the tree.
1267 *
1268 * @return {Number} size
1269 */
1270 size () {
1271 return this.graph.vertexCount()
1272 }
1273&nbsp;
1274 /**
1275 * Returns a clone of the current `Tree` instance.
1276 *
1277 * @return {Tree} clone
1278 */
1279 clone () {
1280 debug('cloning tree')
1281 let timer = utils.timer()
1282 let tree = new Tree(this.root)
1283 tree.graph = this.graph.clone(file =&gt; file.clone(tree), value =&gt; value)
1284 debug('cloned tree (took %s)', timer())
1285 return tree
1286 }
1287&nbsp;
1288 /**
1289 * Remove any files that cannot be reached from the given `anchors`.
1290 *
1291 * @param {Array} anchors A list of files to anchor others to.
1292 */
1293 prune (anchors) {
1294 let timer = utils.timer()
1295 let initialSize = this.size()
1296 let files = anchors.map(file =&gt; this.getFile(id(file)))
1297 debug('pruning files from tree that are not accessible from:')
1298 files.forEach(file =&gt; debug('&gt; %s', utils.relative(file.path)))
1299&nbsp;
1300 let deps = new Set()
1301 files.forEach(file =&gt; {
1302 deps.add(file)
1303 this.dependenciesOf(file, { recursive: true })
1304 .forEach(file =&gt; deps.add(file))
1305 })
1306&nbsp;
1307 this.getFiles()
1308 .filter(file =&gt; !deps.has(file))
1309 .forEach(file =&gt; this.removeFile(file, { force: true }))
1310&nbsp;
1311 debug('%d files pruned from tree (took %s)', initialSize, timer())
1312 }
1313&nbsp;
1314 /**
1315 * Forcibly make this graph acyclic.
1316 */
1317 removeCycles () {
1318 debug('removing cycles from tree')
1319 let timer = utils.timer()
1320 let graph = this.graph
1321 let count = 0
1322 while (graph.hasCycle()) {
1323 let cycle = graph.cycle()
1324 let files = cycle.map(file =&gt; this.getFile(file))
1325 debug('cycle detected:')
1326 files.forEach(file =&gt; debug('&gt; %s (degree: %d)', utils.relative(file.path), graph.outDegree(file.id)))
1327 // prefer to remove edges where the degree is higher, in an attempt to
1328 // avoid altering the graph more than necessary.
1329 let degrees = files.map(file =&gt; graph.outDegree(file.id))
1330 let highest = degrees.indexOf(Math.max.apply(Math, degrees))
1331 let child = files[highest]
1332 let parent = files[highest + 1] ? files[highest + 1] : <span class="branch-1 cbranch-no" title="branch not covered" >files[0]</span>
1333 this.removeDependency(parent, child)
1334 count++
1335 }
1336 debug('removed %d cycles (took %s)', count, timer())
1337 }
1338&nbsp;
1339 /**
1340 * Returns a trimmed object that can be serialized as JSON. It includes a list
1341 * of vertices and edges for reconstructing the underlying graph.
1342 *
1343 * @return {Object} obj
1344 */
1345 toJSON () {
1346 debug('convert to json')
1347 let timer = utils.timer()
1348 let o = {
1349 root: this.root,
1350 files: this.getFiles(),
1351 dependencies: Array.from(this.graph.edges()).map(e =&gt; e.slice(0, 2))
1352 }
1353 debug('converted to json (took %s)', timer())
1354 return o
1355 }
1356&nbsp;
1357 /**
1358 * Serializes the tree into a plain JSON string for writing to storage.
1359 * (probably disk)
1360 *
1361 * @param {Number} space The JSON.stringify space parameter.
1362 * @return {String} str
1363 */
1364 toString (space) {
1365 debug('convert to string')
1366 let timer = utils.timer()
1367 let str = JSON.stringify(this, null, space)
1368 debug('converted to %s string (took %s)', bytes(str.length), timer())
1369 return str
1370 }
1371&nbsp;
1372 /**
1373 * Used to parse a string value into a usable tree.
1374 *
1375 * @static
1376 * @param {String} input The raw JSON string to parse.
1377 * @return {Tree} tree
1378 */
1379 static fromString (input) {
1380 debug('convert from string')
1381 let timer = utils.timer()
1382 let parsed = JSON.parse(input, reviver)
1383 let tree = new Tree(parsed.root)
1384&nbsp;
1385 parsed.files.forEach(o =&gt; {
1386 let file = File.fromObject(o, tree)
1387 debug('file from cache: %s', file.id)
1388 tree.graph.addNewVertex(file.id, file)
1389 })
1390&nbsp;
1391 parsed.dependencies.forEach(e =&gt; {
1392 debug('dependency from cache: %s', e.join(' '))
1393 tree.graph.addNewEdge(e[0], e[1])
1394 })
1395&nbsp;
1396 debug('converted from %s string (took %s)', bytes(input.length), timer())
1397 return tree
1398 }
1399}
1400&nbsp;
1401// single export
1402module.exports = Tree
1403&nbsp;
1404/**
1405 * Helper for retrieving a file id.
1406 *
1407 * @param {File} file The file object or a string id.
1408 * @return {String} id
1409 */
1410function id (file) {
1411 return file instanceof File ? file.id : file
1412}
1413&nbsp;
1414/**
1415 * JSON.parse reviver param for restoring buffers and dates to file objects.
1416 *
1417 * @param {String} key See JSON.parse reviver documentation
1418 * @param {String} value See JSON.parse reviver documentation
1419 * @return {Mixed} revived
1420 */
1421function reviver (key, value) {
1422 if (value &amp;&amp; value.type === 'Buffer') {
1423 return Buffer.from(value.data)
1424 }
1425&nbsp;
1426 if (typeof value === 'string' &amp;&amp; iso.test(value)) {
1427 return new Date(value)
1428 }
1429&nbsp;
1430 return value
1431}
1432&nbsp;</pre></td></tr>
1433</table></pre>
1434<div class='push'></div><!-- for sticky footer -->
1435</div><!-- /wrapper -->
1436<div class='footer quiet pad2 space-top1 center small'>
1437 Code coverage
1438 generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Sat Jul 01 2017 00:49:52 GMT-0700 (PDT)
1439</div>
1440</div>
1441<script src="../prettify.js"></script>
1442<script>
1443window.onload = function () {
1444 if (typeof prettyPrint === 'function') {
1445 prettyPrint();
1446 }
1447};
1448</script>
1449<script src="../sorter.js"></script>
1450</body>
1451</html>