New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

oak

Package Overview
Dependencies
Maintainers
2
Versions
57
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

oak - npm Package Compare versions

Comparing version
5.0.6
to
5.0.7
+1
-0
.dockerignore

@@ -24,1 +24,2 @@ node_modules/

examples/
coverage/
+2
-2
{
"name": "oak",
"version": "5.0.6",
"version": "5.0.7",
"description": "A very opinionated kiosk framework based on Electron",

@@ -51,3 +51,3 @@ "engines": {

"standard": "~12.0.1",
"tape": "~4.9.0"
"tape": "~4.10.0"
},

@@ -54,0 +54,0 @@ "keywords": [

# Oak
[![release](https://img.shields.io/badge/release-v5.0.6-green.svg)](https://github.com/OakLabsInc/oak/releases/tag/5.0.6)
[![release](https://img.shields.io/badge/release-v5.0.7-green.svg)](https://github.com/OakLabsInc/oak/releases/tag/5.0.7)
[![node](https://img.shields.io/badge/node-v10.15.3-green.svg)](https://github.com/nodejs/node/releases/tag/v10.15.3)

@@ -33,12 +33,4 @@ [![electron](https://img.shields.io/badge/electron-v3.1.6-green.svg)](https://github.com/electron/electron/releases/tag/v3.1.6)

> Mac Tip: readlink is missing from OSX.
>
> To fix this run these commands:
>
> ```
> brew install coreutils
> sudo ln -s /usr/local/bin/greadlink /usr/local/bin/readlink
> ./node_modules/.bin/oak-rebuild
> ```
>
> This will allow readlink to work on OSX
> Also make sure you have installed the XCode Commandline Tools
> `xcode-select --install`

@@ -45,0 +37,0 @@ ### Locally

{"/home/chronic/git/oak/index.js":{"path":"/home/chronic/git/oak/index.js","s":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":0,"10":0,"11":0,"12":0,"13":1,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":1,"34":1,"35":1,"36":59,"37":1,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0},"b":{"1":[0,0],"2":[0,0,0,0,0],"3":[0,0],"4":[1,58],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0]},"f":{"1":0,"2":0,"3":59,"4":0},"fnMap":{"1":{"name":"(anonymous_1)","line":118,"loc":{"start":{"line":118,"column":10},"end":{"line":118,"column":34}}},"2":{"name":"(anonymous_2)","line":128,"loc":{"start":{"line":128,"column":10},"end":{"line":128,"column":40}}},"3":{"name":"(anonymous_3)","line":170,"loc":{"start":{"line":170,"column":26},"end":{"line":170,"column":45}}},"4":{"name":"(anonymous_4)","line":177,"loc":{"start":{"line":177,"column":27},"end":{"line":177,"column":46}}}},"statementMap":{"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":51}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":32}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":27}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":39}},"5":{"start":{"line":9,"column":0},"end":{"line":9,"column":36}},"6":{"start":{"line":11,"column":0},"end":{"line":19,"column":44}},"7":{"start":{"line":21,"column":0},"end":{"line":21,"column":13}},"8":{"start":{"line":23,"column":0},"end":{"line":122,"column":4}},"9":{"start":{"line":74,"column":9},"end":{"line":74,"column":21}},"10":{"start":{"line":114,"column":9},"end":{"line":114,"column":21}},"11":{"start":{"line":119,"column":4},"end":{"line":121,"column":5}},"12":{"start":{"line":120,"column":6},"end":{"line":120,"column":20}},"13":{"start":{"line":124,"column":0},"end":{"line":163,"column":4}},"14":{"start":{"line":129,"column":4},"end":{"line":129,"column":19}},"15":{"start":{"line":130,"column":4},"end":{"line":134,"column":5}},"16":{"start":{"line":135,"column":4},"end":{"line":135,"column":21}},"17":{"start":{"line":136,"column":4},"end":{"line":160,"column":5}},"18":{"start":{"line":140,"column":8},"end":{"line":140,"column":16}},"19":{"start":{"line":141,"column":8},"end":{"line":141,"column":29}},"20":{"start":{"line":142,"column":8},"end":{"line":147,"column":9}},"21":{"start":{"line":143,"column":10},"end":{"line":143,"column":44}},"22":{"start":{"line":144,"column":10},"end":{"line":144,"column":15}},"23":{"start":{"line":146,"column":10},"end":{"line":146,"column":25}},"24":{"start":{"line":148,"column":8},"end":{"line":148,"column":29}},"25":{"start":{"line":149,"column":8},"end":{"line":149,"column":13}},"26":{"start":{"line":152,"column":8},"end":{"line":152,"column":42}},"27":{"start":{"line":153,"column":8},"end":{"line":153,"column":13}},"28":{"start":{"line":156,"column":8},"end":{"line":156,"column":40}},"29":{"start":{"line":157,"column":8},"end":{"line":157,"column":19}},"30":{"start":{"line":158,"column":8},"end":{"line":158,"column":13}},"31":{"start":{"line":161,"column":4},"end":{"line":161,"column":20}},"32":{"start":{"line":162,"column":4},"end":{"line":162,"column":25}},"33":{"start":{"line":166,"column":0},"end":{"line":166,"column":50}},"34":{"start":{"line":169,"column":0},"end":{"line":169,"column":43}},"35":{"start":{"line":170,"column":0},"end":{"line":172,"column":1}},"36":{"start":{"line":171,"column":2},"end":{"line":171,"column":69}},"37":{"start":{"line":174,"column":0},"end":{"line":174,"column":26}},"38":{"start":{"line":177,"column":0},"end":{"line":184,"column":1}},"39":{"start":{"line":178,"column":2},"end":{"line":183,"column":4}},"40":{"start":{"line":181,"column":17},"end":{"line":181,"column":31}},"41":{"start":{"line":187,"column":0},"end":{"line":187,"column":26}},"42":{"start":{"line":189,"column":0},"end":{"line":191,"column":1}},"43":{"start":{"line":190,"column":2},"end":{"line":190,"column":33}},"44":{"start":{"line":193,"column":0},"end":{"line":193,"column":22}},"45":{"start":{"line":195,"column":0},"end":{"line":197,"column":1}},"46":{"start":{"line":196,"column":2},"end":{"line":196,"column":16}},"47":{"start":{"line":199,"column":0},"end":{"line":204,"column":10}},"48":{"start":{"line":201,"column":23},"end":{"line":201,"column":33}},"49":{"start":{"line":206,"column":0},"end":{"line":240,"column":1}},"50":{"start":{"line":208,"column":2},"end":{"line":208,"column":39}},"51":{"start":{"line":208,"column":24},"end":{"line":208,"column":38}},"52":{"start":{"line":210,"column":2},"end":{"line":210,"column":71}},"53":{"start":{"line":212,"column":2},"end":{"line":239,"column":3}},"54":{"start":{"line":213,"column":4},"end":{"line":218,"column":5}},"55":{"start":{"line":214,"column":6},"end":{"line":214,"column":59}},"56":{"start":{"line":214,"column":28},"end":{"line":214,"column":58}},"57":{"start":{"line":216,"column":6},"end":{"line":216,"column":55}},"58":{"start":{"line":217,"column":6},"end":{"line":217,"column":21}},"59":{"start":{"line":221,"column":4},"end":{"line":238,"column":5}},"60":{"start":{"line":222,"column":6},"end":{"line":222,"column":26}},"61":{"start":{"line":224,"column":6},"end":{"line":227,"column":7}},"62":{"start":{"line":225,"column":8},"end":{"line":225,"column":194}},"63":{"start":{"line":226,"column":8},"end":{"line":226,"column":23}},"64":{"start":{"line":228,"column":6},"end":{"line":231,"column":7}},"65":{"start":{"line":229,"column":8},"end":{"line":229,"column":155}},"66":{"start":{"line":230,"column":8},"end":{"line":230,"column":23}},"67":{"start":{"line":232,"column":6},"end":{"line":235,"column":7}},"68":{"start":{"line":233,"column":8},"end":{"line":233,"column":173}},"69":{"start":{"line":234,"column":8},"end":{"line":234,"column":23}},"70":{"start":{"line":236,"column":6},"end":{"line":236,"column":22}},"71":{"start":{"line":237,"column":6},"end":{"line":237,"column":21}}},"branchMap":{"1":{"line":119,"type":"if","locations":[{"start":{"line":119,"column":4},"end":{"line":119,"column":4}},{"start":{"line":119,"column":4},"end":{"line":119,"column":4}}]},"2":{"line":136,"type":"switch","locations":[{"start":{"line":137,"column":6},"end":{"line":137,"column":17}},{"start":{"line":138,"column":6},"end":{"line":138,"column":22}},{"start":{"line":139,"column":6},"end":{"line":150,"column":7}},{"start":{"line":151,"column":6},"end":{"line":154,"column":7}},{"start":{"line":155,"column":6},"end":{"line":159,"column":7}}]},"3":{"line":142,"type":"if","locations":[{"start":{"line":142,"column":8},"end":{"line":142,"column":8}},{"start":{"line":142,"column":8},"end":{"line":142,"column":8}}]},"4":{"line":171,"type":"cond-expr","locations":[{"start":{"line":171,"column":29},"end":{"line":171,"column":36}},{"start":{"line":171,"column":39},"end":{"line":171,"column":69}}]},"5":{"line":189,"type":"if","locations":[{"start":{"line":189,"column":0},"end":{"line":189,"column":0}},{"start":{"line":189,"column":0},"end":{"line":189,"column":0}}]},"6":{"line":189,"type":"binary-expr","locations":[{"start":{"line":189,"column":4},"end":{"line":189,"column":58}},{"start":{"line":189,"column":62},"end":{"line":189,"column":109}}]},"7":{"line":195,"type":"if","locations":[{"start":{"line":195,"column":0},"end":{"line":195,"column":0}},{"start":{"line":195,"column":0},"end":{"line":195,"column":0}}]},"8":{"line":206,"type":"if","locations":[{"start":{"line":206,"column":0},"end":{"line":206,"column":0}},{"start":{"line":206,"column":0},"end":{"line":206,"column":0}}]},"9":{"line":212,"type":"if","locations":[{"start":{"line":212,"column":2},"end":{"line":212,"column":2}},{"start":{"line":212,"column":2},"end":{"line":212,"column":2}}]},"10":{"line":224,"type":"if","locations":[{"start":{"line":224,"column":6},"end":{"line":224,"column":6}},{"start":{"line":224,"column":6},"end":{"line":224,"column":6}}]},"11":{"line":228,"type":"if","locations":[{"start":{"line":228,"column":6},"end":{"line":228,"column":6}},{"start":{"line":228,"column":6},"end":{"line":228,"column":6}}]},"12":{"line":232,"type":"if","locations":[{"start":{"line":232,"column":6},"end":{"line":232,"column":6}},{"start":{"line":232,"column":6},"end":{"line":232,"column":6}}]}}},"/home/chronic/git/oak/lib/util.js":{"path":"/home/chronic/git/oak/lib/util.js","s":{"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":1},"b":{"1":[0,0],"2":[0,0],"3":[0,0]},"f":{"1":0},"fnMap":{"1":{"name":"toBoolean","line":3,"loc":{"start":{"line":3,"column":0},"end":{"line":3,"column":23}}}},"statementMap":{"1":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}},"2":{"start":{"line":3,"column":0},"end":{"line":11,"column":1}},"3":{"start":{"line":4,"column":2},"end":{"line":6,"column":3}},"4":{"start":{"line":5,"column":4},"end":{"line":5,"column":16}},"5":{"start":{"line":7,"column":2},"end":{"line":9,"column":3}},"6":{"start":{"line":8,"column":4},"end":{"line":8,"column":14}},"7":{"start":{"line":10,"column":2},"end":{"line":10,"column":70}},"8":{"start":{"line":13,"column":0},"end":{"line":15,"column":2}}},"branchMap":{"1":{"line":4,"type":"if","locations":[{"start":{"line":4,"column":2},"end":{"line":4,"column":2}},{"start":{"line":4,"column":2},"end":{"line":4,"column":2}}]},"2":{"line":7,"type":"if","locations":[{"start":{"line":7,"column":2},"end":{"line":7,"column":2}},{"start":{"line":7,"column":2},"end":{"line":7,"column":2}}]},"3":{"line":7,"type":"binary-expr","locations":[{"start":{"line":7,"column":6},"end":{"line":7,"column":27}},{"start":{"line":7,"column":31},"end":{"line":7,"column":53}}]}}},"/home/chronic/git/oak/lib/index.js":{"path":"/home/chronic/git/oak/lib/index.js","s":{"1":1,"2":1,"3":1,"4":0},"b":{},"f":{},"fnMap":{},"statementMap":{"1":{"start":{"line":1,"column":0},"end":{"line":1,"column":32}},"2":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":23}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":21}}},"branchMap":{}},"/home/chronic/git/oak/lib/core.js":{"path":"/home/chronic/git/oak/lib/core.js","s":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":1},"b":{"1":[0,1],"2":[0,1],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0]},"f":{"1":1,"2":0,"3":0,"4":0,"5":0},"fnMap":{"1":{"name":"(anonymous_1)","line":11,"loc":{"start":{"line":11,"column":14},"end":{"line":11,"column":17}}},"2":{"name":"(anonymous_2)","line":48,"loc":{"start":{"line":48,"column":20},"end":{"line":48,"column":32}}},"3":{"name":"(anonymous_3)","line":56,"loc":{"start":{"line":56,"column":7},"end":{"line":56,"column":14}}},"4":{"name":"(anonymous_4)","line":65,"loc":{"start":{"line":65,"column":7},"end":{"line":65,"column":49}}},"5":{"name":"(anonymous_5)","line":102,"loc":{"start":{"line":102,"column":14},"end":{"line":102,"column":17}}}},"statementMap":{"1":{"start":{"line":1,"column":0},"end":{"line":1,"column":58}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":32}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":50}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":27}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":38}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":32}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":28}},"8":{"start":{"line":12,"column":4},"end":{"line":16,"column":6}},"9":{"start":{"line":17,"column":4},"end":{"line":17,"column":20}},"10":{"start":{"line":18,"column":4},"end":{"line":18,"column":22}},"11":{"start":{"line":19,"column":4},"end":{"line":19,"column":73}},"12":{"start":{"line":21,"column":4},"end":{"line":21,"column":49}},"13":{"start":{"line":22,"column":4},"end":{"line":25,"column":6}},"14":{"start":{"line":26,"column":4},"end":{"line":26,"column":38}},"15":{"start":{"line":28,"column":4},"end":{"line":28,"column":18}},"16":{"start":{"line":29,"column":4},"end":{"line":29,"column":24}},"17":{"start":{"line":31,"column":4},"end":{"line":31,"column":27}},"18":{"start":{"line":33,"column":4},"end":{"line":46,"column":6}},"19":{"start":{"line":34,"column":6},"end":{"line":34,"column":31}},"20":{"start":{"line":35,"column":6},"end":{"line":35,"column":27}},"21":{"start":{"line":36,"column":6},"end":{"line":44,"column":7}},"22":{"start":{"line":36,"column":47},"end":{"line":36,"column":67}},"23":{"start":{"line":37,"column":8},"end":{"line":41,"column":10}},"24":{"start":{"line":42,"column":8},"end":{"line":42,"column":30}},"25":{"start":{"line":43,"column":8},"end":{"line":43,"column":24}},"26":{"start":{"line":45,"column":6},"end":{"line":45,"column":19}},"27":{"start":{"line":48,"column":4},"end":{"line":51,"column":6}},"28":{"start":{"line":49,"column":6},"end":{"line":49,"column":24}},"29":{"start":{"line":50,"column":6},"end":{"line":50,"column":25}},"30":{"start":{"line":53,"column":4},"end":{"line":53,"column":15}},"31":{"start":{"line":57,"column":4},"end":{"line":61,"column":5}},"32":{"start":{"line":58,"column":6},"end":{"line":58,"column":25}},"33":{"start":{"line":60,"column":6},"end":{"line":60,"column":21}},"34":{"start":{"line":62,"column":4},"end":{"line":62,"column":15}},"35":{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},"36":{"start":{"line":67,"column":6},"end":{"line":67,"column":82}},"37":{"start":{"line":69,"column":4},"end":{"line":71,"column":5}},"38":{"start":{"line":70,"column":6},"end":{"line":70,"column":61}},"39":{"start":{"line":72,"column":4},"end":{"line":74,"column":5}},"40":{"start":{"line":73,"column":6},"end":{"line":73,"column":53}},"41":{"start":{"line":76,"column":4},"end":{"line":76,"column":51}},"42":{"start":{"line":78,"column":4},"end":{"line":81,"column":6}},"43":{"start":{"line":83,"column":4},"end":{"line":88,"column":5}},"44":{"start":{"line":91,"column":4},"end":{"line":93,"column":5}},"45":{"start":{"line":92,"column":6},"end":{"line":92,"column":45}},"46":{"start":{"line":95,"column":4},"end":{"line":95,"column":52}},"47":{"start":{"line":97,"column":4},"end":{"line":97,"column":33}},"48":{"start":{"line":99,"column":4},"end":{"line":99,"column":43}},"49":{"start":{"line":103,"column":4},"end":{"line":103,"column":20}},"50":{"start":{"line":106,"column":4},"end":{"line":108,"column":5}},"51":{"start":{"line":107,"column":6},"end":{"line":107,"column":22}},"52":{"start":{"line":110,"column":4},"end":{"line":113,"column":6}},"53":{"start":{"line":111,"column":6},"end":{"line":111,"column":26}},"54":{"start":{"line":112,"column":6},"end":{"line":112,"column":18}},"55":{"start":{"line":115,"column":4},"end":{"line":115,"column":15}},"56":{"start":{"line":119,"column":0},"end":{"line":119,"column":21}}},"branchMap":{"1":{"line":23,"type":"cond-expr","locations":[{"start":{"line":23,"column":26},"end":{"line":23,"column":33}},{"start":{"line":23,"column":36},"end":{"line":23,"column":43}}]},"2":{"line":24,"type":"cond-expr","locations":[{"start":{"line":24,"column":32},"end":{"line":24,"column":50}},{"start":{"line":24,"column":53},"end":{"line":24,"column":58}}]},"3":{"line":36,"type":"if","locations":[{"start":{"line":36,"column":6},"end":{"line":36,"column":6}},{"start":{"line":36,"column":6},"end":{"line":36,"column":6}}]},"4":{"line":57,"type":"if","locations":[{"start":{"line":57,"column":4},"end":{"line":57,"column":4}},{"start":{"line":57,"column":4},"end":{"line":57,"column":4}}]},"5":{"line":66,"type":"if","locations":[{"start":{"line":66,"column":4},"end":{"line":66,"column":4}},{"start":{"line":66,"column":4},"end":{"line":66,"column":4}}]},"6":{"line":66,"type":"binary-expr","locations":[{"start":{"line":66,"column":8},"end":{"line":66,"column":13}},{"start":{"line":66,"column":17},"end":{"line":66,"column":34}}]},"7":{"line":69,"type":"if","locations":[{"start":{"line":69,"column":4},"end":{"line":69,"column":4}},{"start":{"line":69,"column":4},"end":{"line":69,"column":4}}]},"8":{"line":72,"type":"if","locations":[{"start":{"line":72,"column":4},"end":{"line":72,"column":4}},{"start":{"line":72,"column":4},"end":{"line":72,"column":4}}]},"9":{"line":91,"type":"if","locations":[{"start":{"line":91,"column":4},"end":{"line":91,"column":4}},{"start":{"line":91,"column":4},"end":{"line":91,"column":4}}]}}}}
body, html {
margin:0; padding: 0;
height: 100%;
}
body {
font-family: Helvetica Neue, Helvetica, Arial;
font-size: 14px;
color:#333;
}
.small { font-size: 12px; }
*, *:after, *:before {
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing:border-box;
}
h1 { font-size: 20px; margin: 0;}
h2 { font-size: 14px; }
pre {
font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
margin: 0;
padding: 0;
-moz-tab-size: 2;
-o-tab-size: 2;
tab-size: 2;
}
a { color:#0074D9; text-decoration:none; }
a:hover { text-decoration:underline; }
.strong { font-weight: bold; }
.space-top1 { padding: 10px 0 0 0; }
.pad2y { padding: 20px 0; }
.pad1y { padding: 10px 0; }
.pad2x { padding: 0 20px; }
.pad2 { padding: 20px; }
.pad1 { padding: 10px; }
.space-left2 { padding-left:55px; }
.space-right2 { padding-right:20px; }
.center { text-align:center; }
.clearfix { display:block; }
.clearfix:after {
content:'';
display:block;
height:0;
clear:both;
visibility:hidden;
}
.fl { float: left; }
@media only screen and (max-width:640px) {
.col3 { width:100%; max-width:100%; }
.hide-mobile { display:none!important; }
}
.quiet {
color: #7f7f7f;
color: rgba(0,0,0,0.5);
}
.quiet a { opacity: 0.7; }
.fraction {
font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
font-size: 10px;
color: #555;
background: #E8E8E8;
padding: 4px 5px;
border-radius: 3px;
vertical-align: middle;
}
div.path a:link, div.path a:visited { color: #333; }
table.coverage {
border-collapse: collapse;
margin: 10px 0 0 0;
padding: 0;
}
table.coverage td {
margin: 0;
padding: 0;
vertical-align: top;
}
table.coverage td.line-count {
text-align: right;
padding: 0 5px 0 20px;
}
table.coverage td.line-coverage {
text-align: right;
padding-right: 10px;
min-width:20px;
}
table.coverage td span.cline-any {
display: inline-block;
padding: 0 5px;
width: 100%;
}
.missing-if-branch {
display: inline-block;
margin-right: 5px;
border-radius: 3px;
position: relative;
padding: 0 4px;
background: #333;
color: yellow;
}
.skip-if-branch {
display: none;
margin-right: 10px;
position: relative;
padding: 0 4px;
background: #ccc;
color: white;
}
.missing-if-branch .typ, .skip-if-branch .typ {
color: inherit !important;
}
.coverage-summary {
border-collapse: collapse;
width: 100%;
}
.coverage-summary tr { border-bottom: 1px solid #bbb; }
.keyline-all { border: 1px solid #ddd; }
.coverage-summary td, .coverage-summary th { padding: 10px; }
.coverage-summary tbody { border: 1px solid #bbb; }
.coverage-summary td { border-right: 1px solid #bbb; }
.coverage-summary td:last-child { border-right: none; }
.coverage-summary th {
text-align: left;
font-weight: normal;
white-space: nowrap;
}
.coverage-summary th.file { border-right: none !important; }
.coverage-summary th.pct { }
.coverage-summary th.pic,
.coverage-summary th.abs,
.coverage-summary td.pct,
.coverage-summary td.abs { text-align: right; }
.coverage-summary td.file { white-space: nowrap; }
.coverage-summary td.pic { min-width: 120px !important; }
.coverage-summary tfoot td { }
.coverage-summary .sorter {
height: 10px;
width: 7px;
display: inline-block;
margin-left: 0.5em;
background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
}
.coverage-summary .sorted .sorter {
background-position: 0 -20px;
}
.coverage-summary .sorted-desc .sorter {
background-position: 0 -10px;
}
.status-line { height: 10px; }
/* dark red */
.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
.low .chart { border:1px solid #C21F39 }
/* medium red */
.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
/* light red */
.low, .cline-no { background:#FCE1E5 }
/* light green */
.high, .cline-yes { background:rgb(230,245,208) }
/* medium green */
.cstat-yes { background:rgb(161,215,106) }
/* dark green */
.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
.high .chart { border:1px solid rgb(77,146,33) }
/* dark yellow (gold) */
.medium .chart { border:1px solid #f9cd0b; }
.status-line.medium, .medium .cover-fill { background: #f9cd0b; }
/* light yellow */
.medium { background: #fff4c2; }
/* light gray */
span.cline-neutral { background: #eaeaea; }
.cbranch-no { background: yellow !important; color: #111; }
.cstat-skip { background: #ddd; color: #111; }
.fstat-skip { background: #ddd; color: #111 !important; }
.cbranch-skip { background: #ddd !important; color: #111; }
.cover-fill, .cover-empty {
display:inline-block;
height: 12px;
}
.chart {
line-height: 0;
}
.cover-empty {
background: white;
}
.cover-full {
border-right: none !important;
}
pre.prettyprint {
border: none !important;
padding: 0 !important;
margin: 0 !important;
}
.com { color: #999 !important; }
.ignore-none { color: #999; font-weight: normal; }
.wrapper {
min-height: 100%;
height: auto !important;
height: 100%;
margin: 0 auto -48px;
}
.footer, .push {
height: 48px;
}
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for All files</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
/
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">26.62% </span>
<span class="quiet">Statements</span>
<span class='fraction'>37/139</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">7.84% </span>
<span class="quiet">Branches</span>
<span class='fraction'>4/51</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">20% </span>
<span class="quiet">Functions</span>
<span class='fraction'>2/10</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">27.21% </span>
<span class="quiet">Lines</span>
<span class='fraction'>37/136</span>
</div>
</div>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="oak/"><a href="oak/index.html">oak/</a></td>
<td data-value="19.72" class="pic low"><div class="chart"><div class="cover-fill" style="width: 19%;"></div><div class="cover-empty" style="width:81%;"></div></div></td>
<td data-value="19.72" class="pct low">19.72%</td>
<td data-value="71" class="abs low">14/71</td>
<td data-value="7.41" class="pct low">7.41%</td>
<td data-value="27" class="abs low">2/27</td>
<td data-value="25" class="pct low">25%</td>
<td data-value="4" class="abs low">1/4</td>
<td data-value="20.29" class="pct low">20.29%</td>
<td data-value="69" class="abs low">14/69</td>
</tr>
<tr>
<td class="file low" data-value="oak/lib/"><a href="oak/lib/index.html">oak/lib/</a></td>
<td data-value="33.82" class="pic low"><div class="chart"><div class="cover-fill" style="width: 33%;"></div><div class="cover-empty" style="width:67%;"></div></div></td>
<td data-value="33.82" class="pct low">33.82%</td>
<td data-value="68" class="abs low">23/68</td>
<td data-value="8.33" class="pct low">8.33%</td>
<td data-value="24" class="abs low">2/24</td>
<td data-value="16.67" class="pct low">16.67%</td>
<td data-value="6" class="abs low">1/6</td>
<td data-value="34.33" class="pct low">34.33%</td>
<td data-value="67" class="abs low">23/67</td>
</tr>
</tbody>
</table>
</div><div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Sat Feb 02 2019 12:46:16 GMT-0800 (Pacific Standard Time)
</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for oak/</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../prettify.css" />
<link rel="stylesheet" href="../base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="../index.html">all files</a> oak/
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">19.72% </span>
<span class="quiet">Statements</span>
<span class='fraction'>14/71</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">7.41% </span>
<span class="quiet">Branches</span>
<span class='fraction'>2/27</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">25% </span>
<span class="quiet">Functions</span>
<span class='fraction'>1/4</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">20.29% </span>
<span class="quiet">Lines</span>
<span class='fraction'>14/69</span>
</div>
</div>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="index.js"><a href="index.js.html">index.js</a></td>
<td data-value="19.72" class="pic low"><div class="chart"><div class="cover-fill" style="width: 19%;"></div><div class="cover-empty" style="width:81%;"></div></div></td>
<td data-value="19.72" class="pct low">19.72%</td>
<td data-value="71" class="abs low">14/71</td>
<td data-value="7.41" class="pct low">7.41%</td>
<td data-value="27" class="abs low">2/27</td>
<td data-value="25" class="pct low">25%</td>
<td data-value="4" class="abs low">1/4</td>
<td data-value="20.29" class="pct low">20.29%</td>
<td data-value="69" class="abs low">14/69</td>
</tr>
</tbody>
</table>
</div><div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Sat Feb 02 2019 12:46:16 GMT-0800 (Pacific Standard Time)
</div>
</div>
<script src="../prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="../sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for oak/index.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../prettify.css" />
<link rel="stylesheet" href="../base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="../index.html">all files</a> / <a href="index.html">oak/</a> index.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">19.72% </span>
<span class="quiet">Statements</span>
<span class='fraction'>14/71</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">7.41% </span>
<span class="quiet">Branches</span>
<span class='fraction'>2/27</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">25% </span>
<span class="quiet">Functions</span>
<span class='fraction'>1/4</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">20.29% </span>
<span class="quiet">Lines</span>
<span class='fraction'>14/69</span>
</div>
</div>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">59×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">#!/usr/bin/env node
&nbsp;
const { resolve, join, basename } = require('path')
const Module = require('module')
const _ = require('lodash')
&nbsp;
require(join(__dirname, 'lib', 'util'))
&nbsp;
const program = require('commander')
&nbsp;
const {
version: oakVersion,
engines: {
node: nodeVersion
},
dependencies: {
electron: electronVersion
}
} = require(join(__dirname, 'package.json'))
&nbsp;
let opts = {}
&nbsp;
program
.version(oakVersion)
.description('If you load oak with a script path, no commandline options will apply automatically.')
.option(
'-b, --background [String]',
'Hex background color for initial window. Example: #f0f0f0',
'#000000'
)
.option(
'-f, --fullscreen [Boolean]',
'Set the window to full width and height. This overrides the --size option',
_.toBoolean, true
)
.option(
'-k, --kiosk [Boolean]',
'Kiosk mode, which is fullscreen by default. On OSX this will cause the workspace to shift to a whole new one',
_.toBoolean, false
)
.option(
'-s, --size [String]',
'Window size in WIDTHxHEIGHT format. Example: 1024x768. This will over ride both --kiosk and --fullscreen',
/(\d+)x(\d+)/
)
.option(
'-x, --x [Number]',
'Window X position',
_.toInteger, 0
)
.option(
'-y, --y [Number]',
'Window Y position',
_.toInteger, 0
)
.option(
'-t, --title [String]',
'Window title',
_.toString, 'Oak'
)
.option(
'-t, --ontop [Boolean]',
'Start window ontop of others',
_.toBoolean, true
)
.option(
'-D, --display [Number]',
'Display to use',
_.toInteger, 0
)
.option(
'-S, --shortcut [List]',
'Register shortcuts, comma separated. reload,quit',
v =&gt; <span class="cstat-no" title="statement not covered" >v.split(','),</span> []
)
.option(
'-u, --useragent [String]',
'User-Agent string',
_.toString
)
.option(
'-F, --frame [Boolean]',
'Show window frame',
_.toBoolean, false
)
.option(
'--show [Boolean]',
'Show window on start',
_.toBoolean, true
)
.option(
'-n, --node [Boolean]',
'Enable node integration',
_.toBoolean, false
)
.option(
'-i, --insecure [Boolean]',
'Allow insecure connections (not recommended)',
_.toBoolean, false
)
.option(
'-c, --cache [Boolean]',
'Use standard caching, setting this to false has the same effect as the --disable-http-cache chrome flag',
_.toBoolean, true
)
.option(
'-d, --debugger [Boolean]',
'Open chrome dev tools on load',
_.toBoolean, false
)
.option(
'--sslExceptions [Array]',
'Bypass SSL security for specific hosts. This uses a host pattern. Example: *.mysite.com',
v =&gt; <span class="cstat-no" title="statement not covered" >v.split(','),</span> []
)
&nbsp;
.arguments('&lt;uri&gt;')
.action(<span class="fstat-no" title="function not covered" >function (uri, options) {</span>
<span class="cstat-no" title="statement not covered" > if (uri) {</span>
<span class="cstat-no" title="statement not covered" > opts.url = uri</span>
}
})
&nbsp;
program
.command('version [type]')
.description('Prints version, options are are `all`, `oak`, `electron`, `node`')
.option('-j, --json', 'Output in JSON format', false)
.action(<span class="fstat-no" title="function not covered" >function (type = 'oak', opts) {</span>
<span class="cstat-no" title="statement not covered" > let exitVal = 0</span>
<span class="cstat-no" title="statement not covered" > let all = {</span>
oak: oakVersion,
electron: electronVersion,
node: nodeVersion
}
<span class="cstat-no" title="statement not covered" > let out = all.oak</span>
<span class="cstat-no" title="statement not covered" > switch (type) {</span>
case 'oak':
case 'electron':
case 'node': {
<span class="cstat-no" title="statement not covered" > out = {}</span>
<span class="cstat-no" title="statement not covered" > out[type] = all[type]</span>
<span class="cstat-no" title="statement not covered" > if (!_.isUndefined(opts.json)) {</span>
<span class="cstat-no" title="statement not covered" > out = JSON.stringify(out, null, 2)</span>
<span class="cstat-no" title="statement not covered" > break</span>
} else {
<span class="cstat-no" title="statement not covered" > out = out[type]</span>
}
<span class="cstat-no" title="statement not covered" > out[type] = all[type]</span>
<span class="cstat-no" title="statement not covered" > break</span>
}
case 'all': {
<span class="cstat-no" title="statement not covered" > out = JSON.stringify(all, null, 2)</span>
<span class="cstat-no" title="statement not covered" > break</span>
}
default: {
<span class="cstat-no" title="statement not covered" > out = 'Invalid name for version'</span>
<span class="cstat-no" title="statement not covered" > exitVal = 1</span>
<span class="cstat-no" title="statement not covered" > break</span>
}
}
<span class="cstat-no" title="statement not covered" > console.log(out)</span>
<span class="cstat-no" title="statement not covered" > process.exit(exitVal)</span>
})
&nbsp;
// oak gets loaded from this path
const oakPath = join(__dirname, 'lib', 'index.js')
&nbsp;
// resolve future require('oak') to our core path
const origResolve = Module._resolveFilename
Module._resolveFilename = function (request) {
return request === 'oak' ? oakPath : origResolve(...[...arguments])
}
&nbsp;
const oak = require('oak')
&nbsp;
// Attaches oak property to |exports|
<span class="cstat-no" title="statement not covered" >exports.defineProperties = <span class="fstat-no" title="function not covered" >function (exports) {</span></span>
<span class="cstat-no" title="statement not covered" > return Object.defineProperties(exports, {</span>
oak: {
enumerable: false,
get: () =&gt; <span class="cstat-no" title="statement not covered" >require('oak')</span>
}
})
}
&nbsp;
// setting temp argv for commander to use if we are inside our compiled app
<span class="cstat-no" title="statement not covered" >let tmpArgv = process.argv</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >if (_.get(process.env, 'CHROME_DESKTOP') === 'oak.desktop' || basename(process.argv[0]).indexOf('oak') !== -1) {</span>
<span class="cstat-no" title="statement not covered" > tmpArgv = ['', ...process.argv]</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" >program.parse(tmpArgv)</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >if (!opts.url) {</span>
<span class="cstat-no" title="statement not covered" > program.help()</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" >opts = _(program._events)</span>
.omit('*', 'version')
.mapValues((v, k) =&gt; <span class="cstat-no" title="statement not covered" >program[k])</span>
.omitBy(_.isUndefined)
.merge(opts)
.value()
&nbsp;
<span class="cstat-no" title="statement not covered" >if (require('url').parse(opts.url).protocol !== null) {</span>
// if the url argument is a valid URI, load that directly
<span class="cstat-no" title="statement not covered" > oak.on('ready', () =&gt; <span class="cstat-no" title="statement not covered" >oak.load(opts))</span></span>
} else {
<span class="cstat-no" title="statement not covered" > let resolvedURL = resolve(opts.url.replace(/~\//g, process.env.HOME))</span>
// check to see if it's a JSON file
<span class="cstat-no" title="statement not covered" > if (resolvedURL.split('.').pop().toLowerCase() === 'json') {</span>
<span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > oak.on('ready', () =&gt; <span class="cstat-no" title="statement not covered" >oak.load(require(resolvedURL)))</span></span>
} catch (e) {
<span class="cstat-no" title="statement not covered" > console.error('Error (Invalid JSON):', e.message)</span>
<span class="cstat-no" title="statement not covered" > process.exit(1)</span>
}
} else {
// if none of those, require it as a file
<span class="cstat-no" title="statement not covered" > try {</span>
<span class="cstat-no" title="statement not covered" > require(resolvedURL)</span>
} catch (e) {
<span class="cstat-no" title="statement not covered" > if (e.constructor.name === 'SyntaxError') {</span>
<span class="cstat-no" title="statement not covered" > console.error('\nYou have a SyntaxError, but you might have specified a file that cannot be imported using require(). Please check your file type to make sure it is requireable.\n\n', e)</span>
<span class="cstat-no" title="statement not covered" > process.exit(1)</span>
}
<span class="cstat-no" title="statement not covered" > if (e.code === 'MODULE_NOT_FOUND') {</span>
<span class="cstat-no" title="statement not covered" > console.error('Error: Not a valid URL or file path. Make sure you specify a valid URI with a protocol prefix (i.e. http:// or file://)', e.message)</span>
<span class="cstat-no" title="statement not covered" > process.exit(1)</span>
}
<span class="cstat-no" title="statement not covered" > if (e.message.indexOf('NODE_MODULE_VERSION') !== -1) {</span>
<span class="cstat-no" title="statement not covered" > console.error(`Error: Wrong node modules version for electron@${electronVersion}.\nPlease use oak-rebuild, or use electron-rebuild and specify node v${nodeVersion}`)</span>
<span class="cstat-no" title="statement not covered" > process.exit(1)</span>
}
<span class="cstat-no" title="statement not covered" > console.error(e)</span>
<span class="cstat-no" title="statement not covered" > process.exit(1)</span>
}
}
}
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Sat Feb 02 2019 12:46:16 GMT-0800 (Pacific Standard Time)
</div>
</div>
<script src="../prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="../sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for oak/lib/core.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="../../index.html">all files</a> / <a href="index.html">oak/lib/</a> core.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">30.36% </span>
<span class="quiet">Statements</span>
<span class='fraction'>17/56</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">11.11% </span>
<span class="quiet">Branches</span>
<span class='fraction'>2/18</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">20% </span>
<span class="quiet">Functions</span>
<span class='fraction'>1/5</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">30.91% </span>
<span class="quiet">Lines</span>
<span class='fraction'>17/55</span>
</div>
</div>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120</td><td class="line-coverage quiet"><span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const { app, dialog, crashReporter } = require('electron')
&nbsp;
const { join } = require('path')
const { EventEmitter2 } = require('eventemitter2')
const _ = require('lodash')
const minimatch = require('minimatch')
const { parse } = require('url')
const pino = require('pino')
&nbsp;
class Core extends EventEmitter2 {
constructor () {
super({
wildcard: true,
newListener: false,
maxListeners: 200
})
let _this = this
this.ready = false
this.version = require(join(__dirname, '..', 'package.json')).version
&nbsp;
this.debug = process.env.OAK_DEBUG === 'true'
this.log = pino({
level: this.debug ? <span class="branch-0 cbranch-no" title="branch not covered" >'debug' </span>: 'error',
prettyPrint: this.debug ? <span class="branch-0 cbranch-no" title="branch not covered" >{ colorize: true } </span>: false
})
this.crashReporter = crashReporter
&nbsp;
this.app = app
this.quit = app.quit
&nbsp;
<span class="cstat-no" title="statement not covered" > this.sslExceptions = []</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > app.on('certificate-error', (event, webContents, url, error, certificate, cb) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > let { host } = parse(url)</span>
<span class="cstat-no" title="statement not covered" > let isTrusted = false</span>
<span class="cstat-no" title="statement not covered" > if (_.filter(_this.sslExceptions, pat =&gt; <span class="cstat-no" title="statement not covered" >minimatch(host, pat))</span>) {</span>
<span class="cstat-no" title="statement not covered" > _this.log.debug({</span>
name: 'ignoring SSL certificate error',
url,
host
})
<span class="cstat-no" title="statement not covered" > event.preventDefault()</span>
<span class="cstat-no" title="statement not covered" > isTrusted = true</span>
}
<span class="cstat-no" title="statement not covered" > cb(isTrusted)</span>
})
&nbsp;
<span class="cstat-no" title="statement not covered" > app.on('ready', <span class="fstat-no" title="function not covered" >function () {</span></span>
<span class="cstat-no" title="statement not covered" > _this.ready = true</span>
<span class="cstat-no" title="statement not covered" > _this.emit('ready')</span>
})
&nbsp;
<span class="cstat-no" title="statement not covered" > return this</span>
}
&nbsp;
quit <span class="fstat-no" title="function not covered" >(code) {</span>
<span class="cstat-no" title="statement not covered" > if (code) {</span>
<span class="cstat-no" title="statement not covered" > this.app.exit(code)</span>
} else {
<span class="cstat-no" title="statement not covered" > this.app.quit()</span>
}
<span class="cstat-no" title="statement not covered" > return this</span>
}
&nbsp;
load <span class="fstat-no" title="function not covered" >(opts = false, callback = function () {}) {</span>
<span class="cstat-no" title="statement not covered" > if (!opts || !_.isObject(opts)) {</span>
<span class="cstat-no" title="statement not covered" > throw new Error('You need to pass options into Oak as the first parameter.')</span>
}
<span class="cstat-no" title="statement not covered" > if (!this.ready) {</span>
<span class="cstat-no" title="statement not covered" > throw new Error("Oak isn't ready yet, wait your turn!")</span>
}
<span class="cstat-no" title="statement not covered" > if (!_.isString(opts.url)) {</span>
<span class="cstat-no" title="statement not covered" > throw new Error('Oak requires the option: url')</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > let Window = require(join(__dirname, 'window'))</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > opts = _.defaultsDeep(opts, {</span>
scripts: [],
flags: []
})
&nbsp;
<span class="cstat-no" title="statement not covered" > this.sslExceptions = _.uniq(</span>
_.union(
this.sslExceptions,
opts.sslExceptions
)
)
&nbsp;
// Chrome switch flags
<span class="cstat-no" title="statement not covered" > if (!opts.cache) {</span>
<span class="cstat-no" title="statement not covered" > opts.flags.push('--disable-http-cache')</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > opts.flags.forEach(app.commandLine.appendSwitch)</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > global.scripts = opts.scripts</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > return new Window(this, opts, callback)</span>
}
&nbsp;
catchErrors <span class="fstat-no" title="function not covered" >() {</span>
<span class="cstat-no" title="statement not covered" > let _this = this</span>
&nbsp;
// we are (ideally) running without errors on the screen, so we will ignore the dialog box for JS errors
<span class="cstat-no" title="statement not covered" > dialog.showErrorBox = (title, err) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > return undefined</span>
}
// take on uncaughtExceptions, send them to the logger
<span class="cstat-no" title="statement not covered" > process.on('uncaughtException', err =&gt; {</span>
<span class="cstat-no" title="statement not covered" > _this.log.error(err)</span>
<span class="cstat-no" title="statement not covered" > return false</span>
})
&nbsp;
<span class="cstat-no" title="statement not covered" > return this</span>
}
}
&nbsp;
module.exports = Core
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Sat Feb 02 2019 12:46:16 GMT-0800 (Pacific Standard Time)
</div>
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="../../sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for oak/lib/</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="../../index.html">all files</a> oak/lib/
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">33.82% </span>
<span class="quiet">Statements</span>
<span class='fraction'>23/68</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">8.33% </span>
<span class="quiet">Branches</span>
<span class='fraction'>2/24</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">16.67% </span>
<span class="quiet">Functions</span>
<span class='fraction'>1/6</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">34.33% </span>
<span class="quiet">Lines</span>
<span class='fraction'>23/67</span>
</div>
</div>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="core.js"><a href="core.js.html">core.js</a></td>
<td data-value="30.36" class="pic low"><div class="chart"><div class="cover-fill" style="width: 30%;"></div><div class="cover-empty" style="width:70%;"></div></div></td>
<td data-value="30.36" class="pct low">30.36%</td>
<td data-value="56" class="abs low">17/56</td>
<td data-value="11.11" class="pct low">11.11%</td>
<td data-value="18" class="abs low">2/18</td>
<td data-value="20" class="pct low">20%</td>
<td data-value="5" class="abs low">1/5</td>
<td data-value="30.91" class="pct low">30.91%</td>
<td data-value="55" class="abs low">17/55</td>
</tr>
<tr>
<td class="file medium" data-value="index.js"><a href="index.js.html">index.js</a></td>
<td data-value="75" class="pic medium"><div class="chart"><div class="cover-fill" style="width: 75%;"></div><div class="cover-empty" style="width:25%;"></div></div></td>
<td data-value="75" class="pct medium">75%</td>
<td data-value="4" class="abs medium">3/4</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="75" class="pct medium">75%</td>
<td data-value="4" class="abs medium">3/4</td>
</tr>
<tr>
<td class="file low" data-value="util.js"><a href="util.js.html">util.js</a></td>
<td data-value="37.5" class="pic low"><div class="chart"><div class="cover-fill" style="width: 37%;"></div><div class="cover-empty" style="width:63%;"></div></div></td>
<td data-value="37.5" class="pct low">37.5%</td>
<td data-value="8" class="abs low">3/8</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="6" class="abs low">0/6</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="37.5" class="pct low">37.5%</td>
<td data-value="8" class="abs low">3/8</td>
</tr>
</tbody>
</table>
</div><div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Sat Feb 02 2019 12:46:16 GMT-0800 (Pacific Standard Time)
</div>
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="../../sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for oak/lib/index.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="../../index.html">all files</a> / <a href="index.html">oak/lib/</a> index.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">75% </span>
<span class="quiet">Statements</span>
<span class='fraction'>3/4</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">75% </span>
<span class="quiet">Lines</span>
<span class='fraction'>3/4</span>
</div>
</div>
</div>
<div class='status-line medium'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7</td><td class="line-coverage quiet"><span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const { join } = require('path')
const Core = require(join(__dirname, 'core.js'))
&nbsp;
const core = new Core()
&nbsp;
<span class="cstat-no" title="statement not covered" >module.exports = core</span>
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Sat Feb 02 2019 12:46:16 GMT-0800 (Pacific Standard Time)
</div>
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="../../sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for oak/lib/util.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="../../index.html">all files</a> / <a href="index.html">oak/lib/</a> util.js
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">37.5% </span>
<span class="quiet">Statements</span>
<span class='fraction'>3/8</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/6</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">37.5% </span>
<span class="quiet">Lines</span>
<span class='fraction'>3/8</span>
</div>
</div>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16</td><td class="line-coverage quiet"><span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1×</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const _ = require('lodash')
&nbsp;
<span class="fstat-no" title="function not covered" >function toBoolean (v) {</span>
<span class="cstat-no" title="statement not covered" > if (!v) {</span>
<span class="cstat-no" title="statement not covered" > return false</span>
}
<span class="cstat-no" title="statement not covered" > if (typeof v === 'number' || typeof v === 'boolean') {</span>
<span class="cstat-no" title="statement not covered" > return !!v</span>
}
<span class="cstat-no" title="statement not covered" > return _.replace(_.trim(v.toLowerCase()), /[""'']/ig, '') === 'true'</span>
}
&nbsp;
_.mixin({
'toBoolean': toBoolean
})
&nbsp;</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Sat Feb 02 2019 12:46:16 GMT-0800 (Pacific Standard Time)
</div>
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="../../sorter.js"></script>
</body>
</html>
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);

Sorry, the diff of this file is not supported yet

var addSorting = (function () {
"use strict";
var cols,
currentSort = {
index: 0,
desc: false
};
// returns the summary table element
function getTable() { return document.querySelector('.coverage-summary'); }
// returns the thead element of the summary table
function getTableHeader() { return getTable().querySelector('thead tr'); }
// returns the tbody element of the summary table
function getTableBody() { return getTable().querySelector('tbody'); }
// returns the th element for nth column
function getNthColumn(n) { return getTableHeader().querySelectorAll('th')[n]; }
// loads all columns
function loadColumns() {
var colNodes = getTableHeader().querySelectorAll('th'),
colNode,
cols = [],
col,
i;
for (i = 0; i < colNodes.length; i += 1) {
colNode = colNodes[i];
col = {
key: colNode.getAttribute('data-col'),
sortable: !colNode.getAttribute('data-nosort'),
type: colNode.getAttribute('data-type') || 'string'
};
cols.push(col);
if (col.sortable) {
col.defaultDescSort = col.type === 'number';
colNode.innerHTML = colNode.innerHTML + '<span class="sorter"></span>';
}
}
return cols;
}
// attaches a data attribute to every tr element with an object
// of data values keyed by column name
function loadRowData(tableRow) {
var tableCols = tableRow.querySelectorAll('td'),
colNode,
col,
data = {},
i,
val;
for (i = 0; i < tableCols.length; i += 1) {
colNode = tableCols[i];
col = cols[i];
val = colNode.getAttribute('data-value');
if (col.type === 'number') {
val = Number(val);
}
data[col.key] = val;
}
return data;
}
// loads all row data
function loadData() {
var rows = getTableBody().querySelectorAll('tr'),
i;
for (i = 0; i < rows.length; i += 1) {
rows[i].data = loadRowData(rows[i]);
}
}
// sorts the table using the data for the ith column
function sortByIndex(index, desc) {
var key = cols[index].key,
sorter = function (a, b) {
a = a.data[key];
b = b.data[key];
return a < b ? -1 : a > b ? 1 : 0;
},
finalSorter = sorter,
tableBody = document.querySelector('.coverage-summary tbody'),
rowNodes = tableBody.querySelectorAll('tr'),
rows = [],
i;
if (desc) {
finalSorter = function (a, b) {
return -1 * sorter(a, b);
};
}
for (i = 0; i < rowNodes.length; i += 1) {
rows.push(rowNodes[i]);
tableBody.removeChild(rowNodes[i]);
}
rows.sort(finalSorter);
for (i = 0; i < rows.length; i += 1) {
tableBody.appendChild(rows[i]);
}
}
// removes sort indicators for current column being sorted
function removeSortIndicators() {
var col = getNthColumn(currentSort.index),
cls = col.className;
cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
col.className = cls;
}
// adds sort indicators for current column being sorted
function addSortIndicators() {
getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted';
}
// adds event listeners for all sorter widgets
function enableUI() {
var i,
el,
ithSorter = function ithSorter(i) {
var col = cols[i];
return function () {
var desc = col.defaultDescSort;
if (currentSort.index === i) {
desc = !currentSort.desc;
}
sortByIndex(i, desc);
removeSortIndicators();
currentSort.index = i;
currentSort.desc = desc;
addSortIndicators();
};
};
for (i =0 ; i < cols.length; i += 1) {
if (cols[i].sortable) {
// add the click event handler on the th so users
// dont have to click on those tiny arrows
el = getNthColumn(i).querySelector('.sorter').parentElement;
if (el.addEventListener) {
el.addEventListener('click', ithSorter(i));
} else {
el.attachEvent('onclick', ithSorter(i));
}
}
}
}
// adds sorting functionality to the UI
return function () {
if (!getTable()) {
return;
}
cols = loadColumns();
loadData(cols);
addSortIndicators();
enableUI();
};
})();
window.addEventListener('load', addSorting);

Sorry, the diff of this file is not supported yet

# Oak
[![release](https://img.shields.io/badge/release-v5.0.5-green.svg)](https://github.com/OakLabsInc/oak/releases/tag/5.0.5)
[![node](https://img.shields.io/badge/node-v10.15.3-green.svg)](https://github.com/nodejs/node/releases/tag/v10.15.3)
[![electron](https://img.shields.io/badge/electron-v3.1.3-green.svg)](https://github.com/electron/electron/releases/tag/v3.1.3)
[![Coverage Status](https://coveralls.io/repos/github/OakLabsInc/oak/badge.svg?t=zYcBU6)](https://coveralls.io/github/OakLabsInc/oak)
[![Standard - JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-green.svg)](http://standardjs.com/)
A very opinionated kiosk UI application based on [electron](http://electron.atom.io).
## Rationale
Most of the `electron` project if focused around desktop application development, which is great! But when you are dealing with public computing (ATM machines, airline ticketing, movie theater ticket vendors, etc), you don't really need all the features a traditional desktop application requires. This includes things like drag-n-drop, system menus, desktop icons, etc.
The job of the `oak` module is to give a really easy way to make a kiosk application with modern web technology, so that it's repeatable, scalable, and easy to rapidly prototype for production. It also takes care of a few common Electron work flow issues that aren't immediately apparent, but effect kiosks in a big way. A good example of this would be errors displaying in a dialog window.
## Install
```sh
npm install -g oak
```
### Rebuilding native modules
If you are using native node modules, you will generally need to rebuild them to function against the version of node running in `oak`.
```sh
npm install
oak-rebuild $(pwd) #directory path of wherever you want to rebuild
```
> Mac Tip: readlink is missing from OSX.
>
> To fix this run these commands:
>
> ```
> brew install coreutils
> sudo ln -s /usr/local/bin/greadlink /usr/local/bin/readlink
> ./node_modules/.bin/oak-rebuild
> ```
>
> This will allow readlink to work on OSX
### Locally
If you want to use a local version, you can install and execute oak from the `.bin` folder.
```sh
npm install oak
./node_modules/.bin/oak
```
## Quick Start
```text
$ oak --help
Usage: oak [options] <url>
If you load oak with a script path, no commandline options will apply automatically.
Options:
-h, --help output usage information
-V, --version output the version number
-b, --background [String] Hex background color for initial window. Example: #f0f0f0
-f, --fullscreen [Boolean] Set the window to full width and height. This overrides the --size option
-k, --kiosk [Boolean] Kiosk mode, which is fullscreen by default. On OSX this will cause the workspace to shift to a whole new one
-s, --size [String] Window size in WIDTHxHEIGHT format. Example: 1024x768. This will over ride both --kiosk and --fullscreen
-x, --x [Number] Window X position
-y, --y [Number] Window Y position
-t, --title [String] Window title
-t, --ontop [Boolean] Start window ontop of others
-D, --display [Number] Display to use
-S, --shortcut [List] Register shortcuts, comma separated. reload,quit
-u, --useragent [String] User-Agent string
-F, --frame [Boolean] Show window frame
--show [Boolean] Show window on start
-n, --node [Boolean] Enable node integration
-i, --insecure [Boolean] Allow insecure connections (not recommended)
-c, --cache [Boolean] Use HTTP cache
-d, --debugger [Boolean] Open chrome dev tools on load
--sslExceptions [Array] Bypass SSL security for specific hosts. This uses a host pattern. Example: *.mysite.com
--electronVersion Print electron version
```
You can use any URL you want to simply launch a fullscreen webpage, for example:
```sh
oak http://gifdanceparty.giphy.com/
```
## Making an app
`oak` only requires a couple things to get up and running: A URL, or an `index.js` file. You can specify a path to your module the same way you can with a URL:
```sh
oak path/to/app.js
```
### index.js
The most minimal example, this will launch a fullscreen app, injecting the `oak` object into the client side:
```js
const oak = require('oak')
// when oak is ready, we can tell it to load something
oak.on('ready', () => {
// loading takes an options object with a `url`, second parameter is an optional callback
oak.load({
url: 'http://www.mywebapp.com'
}) // or callback)
})
```
### Loading from a JSON file
You can invoke the `oak` cli with a JSON file that contains same options object that you would pass `oak.load()`. An example like above:
```json
{
"url": "http://www.mywebapp.com"
}
```
```sh
oak myOptions.json
```
### `require('oak')`
When you launch your app, the `oak` module is automatically resolved in modules, meaning you don't need to include it in your `package.json` file. This is similar to the way electron exposes it's own modules privately.
### `oak.load(options[, callback])`
Most of these options are wrapping electron.js `BrowserWindow` options, but some are specific to our kiosk use-case. This method returns the `Window` object
* `options`: Object
* `url`: - Not optional
* `String` - The `url` option is the only one required, and will load any valid URI
```js
// load a local HTML file
url: 'file://' + require('path').join(__dirname, 'index.html')
// load your own webserver
url: 'http://localhost:8080'
```
* `title`: String `OAK`- The window title
* `display`: Number `0` - Your display number, and defaults to your main display
* `fullscreen`: Boolean `true` - Set the window to max height and width
* `kiosk`: Boolean `false` - Sets kiosk mode
* `ontop`: Boolean `true` - Set the window to be always on top of others
* `show`: Boolean `true` - Start the window shown, this will also show the window whenever it is reloaded
* `size`: String - Window size in WIDTHxHEIGHT format. Example: 1024x768. This will over ride both `kiosk` and `fullscreen`
* `x`: Number `0` - X position
* `y`: Number `0` - Y position
* `shortcut` Object
* `reload` Boolean `false` - enable CommandOrControl+Shift+R to reload the window
* `quit` Boolean `false` - enable CommandOrControl+Shift+X to close the app
* `background`: String `#000000` - Hex color of the window background
* `frame`: Boolean `false` - Show window frame
* `scripts`: Array `path` - Local node scripts or modules to load into the `window` during pre-dom phase. This can be a object with `name` and `path` if you want the `window.whatever` script to be named
* `flags`: Array - Chrome launch flags to set while starting the window
* `insecure` Boolean `false` - allow running and displaying insecure content (not recommended at all)
* `sslExceptions` Array - Bypass SSL security for specific hosts. This uses a host pattern. Example: `*.mysite.com`
* `cache` Boolean `true` - Enable HTTP cache flag for chrome
* `userAgent`: String - Defaults to `'Oak/' + oak.version`
* `callback`: [Function] - Executed when the `ready` function has fired
#### `oak.getDisplays()`
Returns the current displays, and their metadata. You can use the `id` property to specify a window in `oak.load` properties. An example response:
```javascript
[{
"id": 0,
"bounds": {
"x": 0,
"y": 0,
"width": 1920,
"height": 1080
},
"workArea": {
"x": 0,
"y": 0,
"width": 1920,
"height": 1080
},
"size": {
"width": 1920,
"height": 1080
},
"workAreaSize": {
"width": 1920,
"height": 1080
},
"scaleFactor": 1,
"rotation": 0,
"touchSupport": "unknown"
}]
```
#### `oak.log`
Returns a [`pino`](https://github.com/pinojs/pino/blob/master/docs/api.md) instance for logging. By default the `OAK_DEBUG` environment variable is set to `false`, and will only log messages with the level of `error` or greater.
If you run `OAK_DEBUG=true`, you will get anything with a `debug` level or higher, including verbose window information.
### Window object
`oak.load()` returns a `Window` object with methods and events. Each instance of `oak.load()` returns a unique object for that window, and the methods are mirrored for both the node side and client (renderer) side.
#### `send(event[, payload])`
Send events to the window
* `event`: String - the event namespace, delimited by `.`
* `payload`: Any - whatever data you want to send along.
Example: `window.send('myEvent', { foo: 'bar' })`
#### `on(event, callback)`
This is an instance of `EventEmitter2`
* `ready` - Will emit the ready event, and also execute the optional callback
* `reload` - The window has reloaded
* `oldUrl` - previous URL
* `newUrl` - new resolved URL
* `location` - A window location change has happened (will not fire if `window.location = X` is called in the rendered)
* `oldUrl` - previous URL
* `newUrl` - new resolved URL
* `oldSession` - previous session ID
* `newSession` - new session ID
* `loadFailed` - The window load failed
* `opts`: Object - original options used
* `err`: Error
* `unresponsive` - The window has hung and become unresponsive
#### `location(url)`
Set the URL location of the window. This will fire a `location` event.
* `url`: String - URL to load
#### `reload(cache)`
Reload the window.
* `cache`: Boolean `false` - Reload the window without cache. This will fire a `reload` event.
#### `debug()`
Toggle the chrome debugger
#### `show()`
Show the window
#### `hide()`
Hide the window
#### `focus()`
Set the desktop focus to this window
#### `disableZoom()`
Disables pinch zoom or any window zoom in the browser window
### Window properties
#### `id`
Unique `id` of that window.
### Window events
The window fires events from electrons [`BrowserWindow`](https://electron.atom.io/docs/api/browser-window/#instance-events) and [`webContents`](https://electron.atom.io/docs/api/web-contents/#instance-events). The only event fired from that set into the renderer is `dom-ready`.
*note*: If you do a `send` of the same event from the renderer side, it will look like the same event coming from electron events. So be careful and watch your namespaces for conflicts!
### Environment variables
If you would like to use
## Examples
Check out the [examples](https://github.com/OakLabsInc/oak/tree/master/examples) folder!
## Docker
To get started running `oak` in Docker... you will need to have Docker installed. You can install from [here](https://www.docker.com/community-edition#/download), or on Linux systems, run this script:
```sh
curl -sSL https://get.docker.com/ | sh
# add your user to the docker group
sudo usermod -aG docker $(whoami)
```
You will also need an X server running (`xorg`). If you are on OSX, go ahead and follow the steps below to get setup.
### On Linux
This example is for debian based systems, you can accomplish the same by getting `docker` and `docker-compose` running yourself.
1. Install `python-setuptools`
```sh
sudo apt-get install -y python-setuptools
```
2. Install `pip`
```sh
sudo easy_install pip
```
3. Install `docker-compose`
```sh
pip install docker-compose>=1.8.0
```
4. Allow your `X` server to allow outside connections. Make sure to disable this after you are finished!
```sh
xhost +
docker-compose up
```
You should turn off your open xhost after you are finished developing.
```sh
docker-compose down
xhost -
```
## On OSX
I'm not going to lie... this is a pain in the ass.
OSX doesn't have `xorg`, or any build in X server by default. You are going to be using `socat` to proxy Xquartz via TCP so that you can use your IP address the docker container. It may be easier to start up a VM running ubuntu or debian.
1. Install [homebrew](https://brew.sh/)
Homebrew is a easy way to install linux packages on OSX. In your `Terminal` app:
```sh
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
2. Install `socat` and `python`
* `socat` will be needed to forward your X server socket, in order to display a window on your desktop.
```sh
brew install socat
```
* `python` is useful for a number of reasons, but in our case, a means to get `docker-compose`. When you install `python`, you get the `pip` program along with it.
```sh
brew install python
```
3. Install `docker-compose`
Rather than using straight `docker` commands, we use `docker-compose` to simplfy orchestrating multiple containers. `docker-compose` uses a `.yml` file to describe docker commands and run them.
```
pip install docker-compose
```
4. Install [XQuartz](https://www.xquartz.org/), which is a X server for OSX.
5. Open XQuartz, go to Preferences > Security > Allow connections from network clients.
6. In `Terminal`, run `socat` to proxy your X server connection via TCP:
```sh
socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
```
After you run this, it will be waiting for connections, so don't close this `Terminal` window.
7. Edit `docker-compose.osx.yml`
Replace the X's with your IP address. This will resolve your `socat` connection to the container, which is proxying XQuartz.
```sh
environment:
- DISPLAY=XXX.XXX.XXX.XXX:0
```
If your IP address was `192.168.0.5`, the line would be `DISPLAY=192.168.0.5:0` . Don't forget the `:0` and the end, that specifys that it's the first display, not a port.
8. In your `oak` directory, run `docker-compose -f docker-compse.osx.yml up`
## On Windows
Sorry but you are a little on your own as far as an X server goes! In the future we may update this readme to provide info for developing on Windows. In the mean time... [Cygwin](https://www.cygwin.com/)?

Sorry, the diff of this file is not supported yet