diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..231ff5e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +out +npm-debug.log diff --git a/.node-version b/.node-version new file mode 100644 index 0000000..b4de8e4 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +v8.9.3 diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..3e26b71 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,27 @@ +language: node_js + +node_js: + - "node" + - "lts/*" + +before_script: + - export DISPLAY=:99.0 + - sh -e /etc/init.d/xvfb start + - sleep 3 + +script: + - npm test + - npm run package:linux + +branches: + only: + - master + +cache: + directories: + - node_modules + +notifications: + email: + on_success: never + on_failure: change diff --git a/README.md b/README.md new file mode 100644 index 0000000..0582fe8 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +## Refer to run electron project + +```sh +$ yarn +$ yarn start +$ yarn package:win +``` \ No newline at end of file diff --git a/assets/app-icon/mac/app.icns b/assets/app-icon/mac/app.icns new file mode 100644 index 0000000..f8d4980 Binary files /dev/null and b/assets/app-icon/mac/app.icns differ diff --git a/assets/app-icon/png/1024.png b/assets/app-icon/png/1024.png new file mode 100644 index 0000000..fcda550 Binary files /dev/null and b/assets/app-icon/png/1024.png differ diff --git a/assets/app-icon/png/128.png b/assets/app-icon/png/128.png new file mode 100644 index 0000000..6dada48 Binary files /dev/null and b/assets/app-icon/png/128.png differ diff --git a/assets/app-icon/png/16.png b/assets/app-icon/png/16.png new file mode 100644 index 0000000..0bfd85d Binary files /dev/null and b/assets/app-icon/png/16.png differ diff --git a/assets/app-icon/png/24.png b/assets/app-icon/png/24.png new file mode 100644 index 0000000..e6a95d5 Binary files /dev/null and b/assets/app-icon/png/24.png differ diff --git a/assets/app-icon/png/256.png b/assets/app-icon/png/256.png new file mode 100644 index 0000000..de890da Binary files /dev/null and b/assets/app-icon/png/256.png differ diff --git a/assets/app-icon/png/32.png b/assets/app-icon/png/32.png new file mode 100644 index 0000000..a971ac5 Binary files /dev/null and b/assets/app-icon/png/32.png differ diff --git a/assets/app-icon/png/48.png b/assets/app-icon/png/48.png new file mode 100644 index 0000000..2771985 Binary files /dev/null and b/assets/app-icon/png/48.png differ diff --git a/assets/app-icon/png/512.png b/assets/app-icon/png/512.png new file mode 100644 index 0000000..7abee50 Binary files /dev/null and b/assets/app-icon/png/512.png differ diff --git a/assets/app-icon/png/64.png b/assets/app-icon/png/64.png new file mode 100644 index 0000000..dd98747 Binary files /dev/null and b/assets/app-icon/png/64.png differ diff --git a/assets/app-icon/win/app.ico b/assets/app-icon/win/app.ico new file mode 100644 index 0000000..4127fe8 Binary files /dev/null and b/assets/app-icon/win/app.ico differ diff --git a/assets/code-blocks.js b/assets/code-blocks.js new file mode 100644 index 0000000..f607800 --- /dev/null +++ b/assets/code-blocks.js @@ -0,0 +1,19 @@ +const fs = require('fs') +const path = require('path') + +const codeBlocksWithPaths = document.querySelectorAll('code[data-path]') + +Array.prototype.forEach.call(codeBlocksWithPaths, (code) => { + const codePath = path.join(__dirname, '..', code.dataset.path) + const extension = path.extname(codePath) + code.classList.add(`language-${extension.substring(1)}`) + code.textContent = fs.readFileSync(codePath) +}) + +document.addEventListener('DOMContentLoaded', () => { + const highlight = require('highlight.js') + const codeBlocks = document.querySelectorAll('pre code') + Array.prototype.forEach.call(codeBlocks, (code) => { + highlight.highlightBlock(code) + }) +}) diff --git a/assets/css/about.css b/assets/css/about.css new file mode 100644 index 0000000..51abfb9 --- /dev/null +++ b/assets/css/about.css @@ -0,0 +1,155 @@ +/* Welcome ------------------------ */ + +.about { + --about-space: 4rem; + + position: absolute; + display: flex; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1; + overflow-x: hidden; + overflow-y: auto; + padding: 0; + background-color: hsl(0,0%,98%); + pointer-events: none; + visibility: hidden; + opacity: 0; + transform: scale(1.1); + transition: visibility 0s .12s linear , opacity .12s ease-in, transform .12s ease-in; +} +.about.is-shown { + pointer-events: auto; + visibility: visible; + opacity: 1; + transform: scale(1); + transition: visibility 0s 0s linear , opacity .24s ease-out, transform .24s ease-out; +} + +.about-wrapper { + margin: auto; +} + +.about-header { + padding: var(--about-space) 0; + border-bottom: 1px solid hsl(0,0%,88%); +} + +.about-logo { + display: block; + margin: 0 auto; + width: 320px; /* TODO: Adjust asset to this size */ + max-width: 100%; +} + +.about-sections { + max-width: 680px; + padding: 0 var(--about-space); +} + +.about-section { + margin: var(--about-space) 0; +} + +.about h2 { + text-align: center; + margin: 0 0 1em 0; + font-size: 1.5em; + color: hsl(0, 0%, 55%); +} + +.about .about-code h2 { + color: hsl(330, 65%, 55%); +} + +.about .play-along h2 { + color: hsl(222, 53%, 50%); +} + +.about-button { + display: block; + margin: 0 auto; + padding: .4em 1.2em; + font: inherit; + font-size: 1.6em; + color: inherit; + border: 2px solid; + border-radius: 4px; + background-color: transparent; +} +.about-button:focus { + outline: none; + border-color: hsl(0,0%,88%); +} + +footer.about-section { + text-align: center; +} + +.rainbow-button-wrapper { + --rainbow-button-width: 170px; + --rainbow-button-height: 50px; + --rainbow-button-width-inner: 164px; + --rainbow-button-height-inner: 44px; + --rainbow-color-1: hsl(116, 30%, 36%); + --rainbow-color-2: hsl(194, 60%, 36%); + --rainbow-color-3: hsl(222, 53%, 50%); + --rainbow-color-4: hsl(285, 47%, 46%); + --rainbow-color-5: hsl(330, 65%, 48%); + --rainbow-color-6: hsl(32, 79%, 49%); + --rainbow-color-7: hsl(53, 84%, 50%); + + display: inline-block; + width: var(--rainbow-button-width); + height: var(--rainbow-button-height); + position: relative; + overflow: hidden; + border-radius: 5px; +} + +.rainbow-button-wrapper:before { + display: block; + position: absolute; + z-index: 2; + top: 0; + left: 0; + width: 600px; + height: var(--rainbow-button-height); + background: #CCC; + background: linear-gradient(to right, var(--rainbow-color-1) 0%, var(--rainbow-color-2) 14%, var(--rainbow-color-3) 28%, var(--rainbow-color-4) 42%, var(--rainbow-color-5) 56%, var(--rainbow-color-6) 70%, var(--rainbow-color-7) 84%, var(--rainbow-color-1) 100%); + background-position: -200px 0; + transition: all 0.5s; + content: ""; +} + +.rainbow-button-wrapper button { + display: block; + width: var(--rainbow-button-width-inner); + height: var(--rainbow-button-height-inner); + position: absolute; + z-index: 3; + top: 3px; + left: 3px; + border: none; + background: white; + color: black; + font-size: 1.3rem; +} + +.rainbow-button-wrapper:hover:before { + background-position: 200px 0; +} + +@media (min-width: 940px) { + .about-header { + align-self: center; + padding: var(--about-space); + border-right: 1px solid hsl(0,0%,88%); + border-bottom: none; + } + .about-wrapper { + display: flex; + } +} diff --git a/assets/css/demo.css b/assets/css/demo.css new file mode 100644 index 0000000..96afc4b --- /dev/null +++ b/assets/css/demo.css @@ -0,0 +1,205 @@ +/* Demo */ + +.demo:first-of-type { + margin-top: 2rem; +} +.demo:last-of-type { + margin-bottom: 2rem; +} +@media (min-width: 940px) { + .demo:last-of-type { + margin-bottom: 4rem; + } +} + +.demo-wrapper { + position: relative; + max-width: 740px; + margin: 0 auto; + padding: 0 2rem; +} + + +/* Toggle Button ----------------------------- */ + +.demo-toggle-button { + position: relative; + display: block; + margin: 0; + padding: .5em 1.5em; + line-height: 1.5; + font: inherit; + font-weight: 600; + font-size: 1.2em; + text-align: left; + border: none; + color: inherit; + background-color: transparent; + transition: border-color .12s; + outline: none; +} + +.demo-toggle-button:before, +.demo-toggle-button:after { + content: ""; + position: absolute; + left: 0; + width: 2px; + height: 50%; + background-color: hsl(0,0%,88%); + transition: transform .2s cubic-bezier(.4,.1,0,1); +} +.demo-toggle-button:before { + top: 0; + transform-origin: bottom center; + transform: translateX(.7em) rotate(-30deg) scale(.75); +} +.demo-toggle-button:after { + bottom: 0; + transform-origin: top center; + transform: translateX(.7em) rotate(30deg) scale(.75); +} +.is-open .demo-toggle-button:before, +.is-open .demo-toggle-button:after { + transform: rotate(0deg); +} +.demo-toggle-button:focus:before, +.demo-toggle-button:focus:after { + background-color: currentColor; +} + +/* Meta info */ + +.demo-meta { + margin-top: .2em; + font-size: 11px; + font-weight: 300; + text-transform: uppercase; + color: var(--color-subtle); +} +.demo-meta-divider { + margin: 0 .5em; +} + + +/* Demo Box ----------------------------- */ + +.demo-box { + display: none; + position: relative; + padding: 2em; + margin-top: 1em; + margin-bottom: 2em; + border-radius: 6px; + border: 1px solid var(--color-border); + background-color: var(--color-bg); +} +.demo-box:before { + content: ""; + position: absolute; + top: -11px; + width: 20px; + height: 20px; + background-color: inherit; + border-top: inherit; + border-right: inherit; + border-top-right-radius: 3px; + transform: rotate(-45deg); +} + +.is-open .demo-box { + display: block; + animation: demo-box-fade-in .2s cubic-bezier(0, .20, .20, .96); +} +@keyframes demo-box-fade-in { + 0% { opacity: 0; transform: translateY(-20px); } + 100% { opacity: 1; transform: translateY(0); } +} + +.demo-box > p:first-child { + margin-top: 0; +} + +.demo-box h5 { + font-size: 1em; + margin-bottom: .6em; +} + + +/* Demo Controls ----------------------------- */ + +.demo-controls { + display: flex; + align-items: center; +} + +.demo-button { + align-self: flex-start; + margin-right: 1em; + border: 2px solid; + border-radius: 4px; + font: inherit; + font-size: 1.2em; + padding: .4em 1.2em; + color: inherit; + background-color: transparent; +} +.demo-button:focus { + outline: none; + background-color: white; +} +.demo-button:active { + border-color: var(--color-border); +} + +.demo-input { + flex: 1; + border: 2px solid var(--color-border); + border-radius: 4px; + font: inherit; + font-size: 1.2em; + padding: .4em .8em; + color: inherit; + background-color: transparent; +} +.demo-input:focus { + outline: none; + border-color: hsl(0,0%,80%); + background-color: white; +} + +.demo-response { + flex: 1; + word-break: break-word; +} + +.smooth-appear { + opacity: 1; + transition: opacity .5s ease-in-out; +} + +.disappear { + opacity: 0; +} +.demo-button.smooth-disappear:focus { + outline: inherit; + border-color: inherit; + background-color: inherit; +} + +/* ProTip ----------------------------- */ + +.demo-protip { + margin-top: 2rem; + padding: 1.5rem 2rem 2rem 2rem; + border: 1px solid hsla(0,0%,0%,.06); + border-radius: 6px; + background: var(--color-accent) linear-gradient(hsla(0,0%,100%,.85), hsla(0,0%,100%,.85)); +} +.demo-protip h2 { + margin: 0 0 .5rem 0; +} +.demo-protip strong { + font-weight: 600; +} + diff --git a/assets/css/fonts/SourceCodePro-Regular.ttf b/assets/css/fonts/SourceCodePro-Regular.ttf new file mode 100644 index 0000000..85686d9 Binary files /dev/null and b/assets/css/fonts/SourceCodePro-Regular.ttf differ diff --git a/assets/css/fonts/SourceSansPro-Black.otf b/assets/css/fonts/SourceSansPro-Black.otf new file mode 100644 index 0000000..21cdb25 Binary files /dev/null and b/assets/css/fonts/SourceSansPro-Black.otf differ diff --git a/assets/css/fonts/SourceSansPro-BlackIt.otf b/assets/css/fonts/SourceSansPro-BlackIt.otf new file mode 100644 index 0000000..e284181 Binary files /dev/null and b/assets/css/fonts/SourceSansPro-BlackIt.otf differ diff --git a/assets/css/fonts/SourceSansPro-Bold.otf b/assets/css/fonts/SourceSansPro-Bold.otf new file mode 100644 index 0000000..200e2bf Binary files /dev/null and b/assets/css/fonts/SourceSansPro-Bold.otf differ diff --git a/assets/css/fonts/SourceSansPro-BoldIt.otf b/assets/css/fonts/SourceSansPro-BoldIt.otf new file mode 100644 index 0000000..6d149ee Binary files /dev/null and b/assets/css/fonts/SourceSansPro-BoldIt.otf differ diff --git a/assets/css/fonts/SourceSansPro-ExtraLight.otf b/assets/css/fonts/SourceSansPro-ExtraLight.otf new file mode 100644 index 0000000..0db4a3a Binary files /dev/null and b/assets/css/fonts/SourceSansPro-ExtraLight.otf differ diff --git a/assets/css/fonts/SourceSansPro-ExtraLightIt.otf b/assets/css/fonts/SourceSansPro-ExtraLightIt.otf new file mode 100644 index 0000000..ce0b268 Binary files /dev/null and b/assets/css/fonts/SourceSansPro-ExtraLightIt.otf differ diff --git a/assets/css/fonts/SourceSansPro-It.otf b/assets/css/fonts/SourceSansPro-It.otf new file mode 100644 index 0000000..e93d6e4 Binary files /dev/null and b/assets/css/fonts/SourceSansPro-It.otf differ diff --git a/assets/css/fonts/SourceSansPro-Light.otf b/assets/css/fonts/SourceSansPro-Light.otf new file mode 100644 index 0000000..87e9fd8 Binary files /dev/null and b/assets/css/fonts/SourceSansPro-Light.otf differ diff --git a/assets/css/fonts/SourceSansPro-LightIt.otf b/assets/css/fonts/SourceSansPro-LightIt.otf new file mode 100644 index 0000000..5ba79c1 Binary files /dev/null and b/assets/css/fonts/SourceSansPro-LightIt.otf differ diff --git a/assets/css/fonts/SourceSansPro-Regular.otf b/assets/css/fonts/SourceSansPro-Regular.otf new file mode 100644 index 0000000..ee2f16d Binary files /dev/null and b/assets/css/fonts/SourceSansPro-Regular.otf differ diff --git a/assets/css/fonts/SourceSansPro-Semibold.otf b/assets/css/fonts/SourceSansPro-Semibold.otf new file mode 100644 index 0000000..5d49658 Binary files /dev/null and b/assets/css/fonts/SourceSansPro-Semibold.otf differ diff --git a/assets/css/fonts/SourceSansPro-SemiboldIt.otf b/assets/css/fonts/SourceSansPro-SemiboldIt.otf new file mode 100644 index 0000000..68bfb4b Binary files /dev/null and b/assets/css/fonts/SourceSansPro-SemiboldIt.otf differ diff --git a/assets/css/github.css b/assets/css/github.css new file mode 100644 index 0000000..791932b --- /dev/null +++ b/assets/css/github.css @@ -0,0 +1,99 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + color: #333; + background: #f8f8f8; +} + +.hljs-comment, +.hljs-quote { + color: #998; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: #333; + font-weight: bold; +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: #008080; +} + +.hljs-string, +.hljs-doctag { + color: #d14; +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: #900; + font-weight: bold; +} + +.hljs-subst { + font-weight: normal; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: bold; +} + +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: #000080; + font-weight: normal; +} + +.hljs-regexp, +.hljs-link { + color: #009926; +} + +.hljs-symbol, +.hljs-bullet { + color: #990073; +} + +.hljs-built_in, +.hljs-builtin-name { + color: #0086b3; +} + +.hljs-meta { + color: #999; + font-weight: bold; +} + +.hljs-deletion { + background: #fdd; +} + +.hljs-addition { + background: #dfd; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/assets/css/global.css b/assets/css/global.css new file mode 100644 index 0000000..b9d96fc --- /dev/null +++ b/assets/css/global.css @@ -0,0 +1,164 @@ +/* Fonts ---------------------------- */ + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Code Pro'), local('SourceCodePro'), url(fonts/SourceCodePro-Regular.ttf) format('truetype'); +} + + +/* Global ---------------------------- */ + +* { + box-sizing: border-box; +} + +html { + height: 100%; + font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif; + font-size: 14px; + line-height: 1.5; + overflow: hidden; /* Prevents rubber-band scrolling of the whole "page" */ + color: var(--color); + background-color: #fff; /* To cover OSes with no default background color */ +} + +body { + margin: 0; + height: 100%; + display: flex; +} + +a { + color: var(--color-link); +} + +h1, +h2, +h3 { + margin-top: 0; + line-height: 1.5; +} + +h1 { + font-size: 1.5em; + font-weight: 600; +} + +h2 { + font-size: 1.3em; + font-weight: normal; +} + +h3 { + font-size: 1.12em; + font-weight: 600; +} + +table { + width: 100%; + border-spacing: 0; + border: 1px solid hsla(0,0%,0%,.08); + border-width: 0 1px 1px 0; +} +th { + background-color: hsla(0,0%,50%,.06); +} +th, +td { + text-align: center; + border: 1px solid hsla(0,0%,0%,.08); + border-width: 1px 0 0 1px; +} + +svg { + fill: currentColor; +} + +/* Code */ + +code, kbd { + font-family: 'Source Code Pro', monospace; + border-radius: 4px; + padding: 1px 4px; + white-space: nowrap; + color: hsl(0,0%,36%); + background-color: hsla(0,0%,60%,.15); +} + +pre, kbd { + font-size: 13px; + overflow: auto; + padding: 1em; + margin: 0; + border-radius: 4px; + border: 1px solid; + border-color: var(--color-border); + background-color: white; +} + +pre code { + white-space: pre; +} + +pre > .hljs { + color: var(--color-subtle); + background-color: white; +} + +kbd { + padding: 0.5em; +} + + +/* Utilities ---------------------------- */ + +.u-avoid-clicks { + pointer-events: none; +} + +/* Visually hidden, but will be read by screen readers */ +.u-visible-to-screen-reader { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +.no-display { + display: none; +} + + +/* Content ------------------ */ + +.content { + flex: 1; + position: relative; + overflow: hidden; + visibility: hidden; + opacity: 0; +} +.content.is-shown { + visibility: visible;; + opacity: 1; +} + + +/* Hacks ---------------------------- */ + +/* Fixes horizontal scrolling in code blocks on OS X El Cap (10.11.3), retina screen + * + * By adding an invisible outline property, it will force a repaint + * which enables the scrolling. + */ + +.hljs:hover, +.hljs:active { + outline: 1px solid transparent; +} diff --git a/assets/css/nativize.css b/assets/css/nativize.css new file mode 100644 index 0000000..1942953 --- /dev/null +++ b/assets/css/nativize.css @@ -0,0 +1,59 @@ +/* +** nativize.css +** Makes the UI feel more native +*/ + +html { + font-family: sans-serif; + -webkit-user-select: none; /* disable selection */ + -webkit-user-drag: none; /* disable dragging */ + cursor: default; /* use default cursor */ +} + +body { + margin: 0; /* remove default margin */ +} + + +/* enable text selection */ + +.is-selectable, +pre, +code { + -webkit-user-select: auto; + cursor: auto; +} + + +/* Buttons and links */ + +button{ + cursor: default; +} + +/* Internal links */ +a { + cursor: pointer; + text-decoration: none; + border-bottom: 1px dashed; + outline: none; +} + +/* New window (target) + external links */ +a[target], +a[href^="https://"], +a[href^="http://"] { + border-bottom: 1px solid; +} + +a:hover, +a:focus { + border-bottom: none; +} + + +/* Images */ + +img { + -webkit-user-drag: none; /* disable dragging */ +} diff --git a/assets/css/nav.css b/assets/css/nav.css new file mode 100644 index 0000000..4c371d4 --- /dev/null +++ b/assets/css/nav.css @@ -0,0 +1,149 @@ +/* Nav */ + +.nav { + width: 340px; + overflow-x: hidden; + overflow-y: auto; + color: var(--color-subtle); + border-right: 1px solid var(--color-border); + background-color: var(--color-bg); + visibility: hidden; + opacity: 0; +} +.nav.is-shown { + visibility: visible;; + opacity: 1; +} + +.nav-header { + position: relative; + padding: 2rem; + margin-bottom: 1rem; + border-bottom: 1px solid var(--color-border); +} + +.nav-title { + text-transform: uppercase; + font-weight: 300; + line-height: 1; + margin: 0; +} + +.nav-title strong { + font-weight: 600; + color: var(--color-strong); +} + +.nav-header-icon { + position: absolute; + width: 36px; + height: 36px; + top: 1.5rem; /* magic */ + right: 1.75rem; /* magic */ +} + + + +.nav-item { + padding: .5em 0; +} + +.nav-icon { + width: 16px; + height: 16px; + vertical-align: top; + margin-right: .25rem; +} + +.nav-category { + margin: .2em 0; + padding-left: 2rem; + font-size: 11px; + font-weight: normal; + text-transform: uppercase; +} + +.nav-button { + display: block; + width: 100%; + padding: .3rem; + padding-left: calc(2rem + 16px + .5rem); /* padding + icon + magic */ + line-height: 2; + text-align: left; + font: inherit; + font-size: 13px; + color: inherit; + border: none; + background-color: transparent; + cursor: default; + outline: none; +} +.nav-button:hover, +.nav-button:focus:not(.is-selected) { + background-color: hsla(0,0%,0%,.1); +} +.nav-button.is-selected { + background-color: var(--color-accent); +} +.nav-button.is-selected, +.nav-button.is-selected em { + color: #fff; +} +.nav-button.is-selected:focus { + opacity: .8; +} + +.nav-button em { + font-style: normal; + font-weight: 600; + color: var(--color-strong); + pointer-events: none; /* makes it invisible to clicks */ +} + +.nav-footer { + margin-top: 1rem; + padding: 2rem; + border-top: 1px solid var(--color-border); + text-align: center; +} + +.nav-footer-icon { + width: calc(770px / 6.5); + height: calc(88px / 6.5); +} + +.nav-footer a { + outline: none; +} + +.nav-footer-button { + display: block; + width: 100%; + padding: 0; + margin-bottom: .75rem; + line-height: 2; + text-align: left; + font: inherit; + font-size: 13px; + color: inherit; + border: none; + background-color: transparent; + cursor: default; + outline: none; + text-align: center; +} +.nav-footer-button:focus { + color: var(--color-strong); +} + +.nav-footer-logo { + color: hsl(0,0%,66%); +} +.nav-footer-logo:focus { + color: hsl(0,0%,33%); +} + +/* Remove border on the logo */ +.nav-footer-logo.nav-footer-logo { + border-bottom: none; +} diff --git a/assets/css/print.css b/assets/css/print.css new file mode 100644 index 0000000..605ce74 --- /dev/null +++ b/assets/css/print.css @@ -0,0 +1,31 @@ +@media print { + body { + background: none; + color: black !important; + font-size: 70%; + margin: 0; padding: 0; + } + + h1 { + font-size: 22px; + } + + .nav, button, .demo-box:before, + header p { + display: none; + } + + .demo-box, h2, + pre, code { + padding: 0 !important; + margin: 0 !important; + } + + header { + padding: 0 0 10px 0; + } + + code, .support { + font-size: 10px; + } +} diff --git a/assets/css/section.css b/assets/css/section.css new file mode 100644 index 0000000..90f4407 --- /dev/null +++ b/assets/css/section.css @@ -0,0 +1,51 @@ +/* Section ------------------ */ + +.section { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + overflow-x: hidden; + overflow-y: auto; + color: var(--color-accent); + + /* Hide */ + pointer-events: none; + visibility: hidden; + opacity: 0; + transform: translateX(-20px); + transition: visibility 0s .12s linear , opacity .12s ease-in, transform .12s ease-in; +} +.section.is-shown { + pointer-events: auto; + visibility: visible; + opacity: 1; + transform: translateX(0); + transition: visibility 0s 0s linear , opacity .36s ease-out, transform .36s ease-out; +} + +.section h3, +.section p { + color: var(--color); +} + +.section-wrapper { + position: relative; + max-width: 740px; + margin: 0 auto; + padding: 2rem 2rem 1rem 2rem; + border-bottom: 1px solid var(--color-border); +} +@media (min-width: 940px) { + .section-wrapper { + padding-top: 4rem; + } +} + +.section-icon { + width: 32px; + height: 32px; + vertical-align: middle; + margin-right: .5em; +} diff --git a/assets/css/variables.css b/assets/css/variables.css new file mode 100644 index 0000000..3f20970 --- /dev/null +++ b/assets/css/variables.css @@ -0,0 +1,24 @@ + +/* Custom Properties */ + +:root { + --color: hsl(0,0%,22%); + --color-subtle: hsl(0,0%,44%); + --color-strong: hsl(0,0%,11%); + --color-link: hsl(0,0%,22%); + + --color-border: hsl(0,0%,88%); + --color-bg: hsl(0,0%,96%); + + --color-accent: black; /* Fallback */ +} + + +/* Category Colors */ + +.u-category-windows { --color-accent: hsl(116, 30%, 36%); } +.u-category-menu { --color-accent: hsl(194, 60%, 36%); } +.u-category-native-ui { --color-accent: hsl(222, 53%, 50%); } +.u-category-communication { --color-accent: hsl(285, 47%, 46%); } +.u-category-system { --color-accent: hsl(330, 65%, 48%); } +.u-category-media { --color-accent: hsl( 36, 77%, 34%); } diff --git a/assets/demo-btns.js b/assets/demo-btns.js new file mode 100644 index 0000000..b00c781 --- /dev/null +++ b/assets/demo-btns.js @@ -0,0 +1,26 @@ +const settings = require('electron-settings') + +const demoBtns = document.querySelectorAll('.js-container-target') +// Listen for demo button clicks +Array.prototype.forEach.call(demoBtns, (btn) => { + btn.addEventListener('click', (event) => { + const parent = event.target.parentElement + + // Toggles the "is-open" class on the demo's parent element. + parent.classList.toggle('is-open') + + // Saves the active demo if it is open, or clears it if the demo was user + // collapsed by the user + if (parent.classList.contains('is-open')) { + settings.set('activeDemoButtonId', event.target.getAttribute('id')) + } else { + settings.delete('activeDemoButtonId') + } + }) +}) + +// Default to the demo that was active the last time the app was open +const buttonId = settings.get('activeDemoButtonId') +if (buttonId) { + document.getElementById(buttonId).click() +} diff --git a/assets/ex-links.js b/assets/ex-links.js new file mode 100644 index 0000000..4319f8c --- /dev/null +++ b/assets/ex-links.js @@ -0,0 +1,13 @@ +const shell = require('electron').shell + +const links = document.querySelectorAll('a[href]') + +Array.prototype.forEach.call(links, (link) => { + const url = link.getAttribute('href') + if (url.indexOf('http') === 0) { + link.addEventListener('click', (e) => { + e.preventDefault() + shell.openExternal(url) + }) + } +}) diff --git a/assets/img/about.png b/assets/img/about.png new file mode 100644 index 0000000..1558285 Binary files /dev/null and b/assets/img/about.png differ diff --git a/assets/img/about@2x.png b/assets/img/about@2x.png new file mode 100644 index 0000000..3dff436 Binary files /dev/null and b/assets/img/about@2x.png differ diff --git a/assets/img/diagram.png b/assets/img/diagram.png new file mode 100644 index 0000000..ea4e64b Binary files /dev/null and b/assets/img/diagram.png differ diff --git a/assets/img/icons.svg b/assets/img/icons.svg new file mode 100644 index 0000000..e41b557 --- /dev/null +++ b/assets/img/icons.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/img/loading.gif b/assets/img/loading.gif new file mode 100644 index 0000000..dec47d8 Binary files /dev/null and b/assets/img/loading.gif differ diff --git a/assets/img/programming.png b/assets/img/programming.png new file mode 100644 index 0000000..c68fdb6 Binary files /dev/null and b/assets/img/programming.png differ diff --git a/assets/img/ui-terminology.png b/assets/img/ui-terminology.png new file mode 100644 index 0000000..4a10f9a Binary files /dev/null and b/assets/img/ui-terminology.png differ diff --git a/assets/imports.js b/assets/imports.js new file mode 100644 index 0000000..e553344 --- /dev/null +++ b/assets/imports.js @@ -0,0 +1,12 @@ +const links = document.querySelectorAll('link[rel="import"]') + +// Import and add each page to the DOM +Array.prototype.forEach.call(links, (link) => { + let template = link.import.querySelector('.task-template') + let clone = document.importNode(template.content, true) + if (link.href.match('about.html')) { + document.querySelector('body').appendChild(clone) + } else { + document.querySelector('.content').appendChild(clone) + } +}) diff --git a/assets/mac/child.plist b/assets/mac/child.plist new file mode 100644 index 0000000..d8dc69e --- /dev/null +++ b/assets/mac/child.plist @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.inherit + + + diff --git a/assets/mac/info.plist b/assets/mac/info.plist new file mode 100644 index 0000000..626f204 --- /dev/null +++ b/assets/mac/info.plist @@ -0,0 +1,19 @@ + + + + + CFBundleURLTypes + + + CFBundleURLSchemes + + electron-api-demos + + CFBundleURLName + Electron API Demos Protocol + + + ElectronTeamID + VEKTX9H2N7 + + diff --git a/assets/mac/parent.plist b/assets/mac/parent.plist new file mode 100644 index 0000000..0553a4b --- /dev/null +++ b/assets/mac/parent.plist @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.application-groups + VEKTX9H2N7.com.github.electron-api-demos + com.apple.security.files.user-selected.read-write + + + diff --git a/assets/nav.js b/assets/nav.js new file mode 100644 index 0000000..08b4a70 --- /dev/null +++ b/assets/nav.js @@ -0,0 +1,76 @@ +const settings = require('electron-settings') + +document.body.addEventListener('click', (event) => { + if (event.target.dataset.section) { + handleSectionTrigger(event) + } else if (event.target.dataset.modal) { + handleModalTrigger(event) + } else if (event.target.classList.contains('modal-hide')) { + hideAllModals() + } +}) + +function handleSectionTrigger (event) { + hideAllSectionsAndDeselectButtons() + + // Highlight clicked button and show view + event.target.classList.add('is-selected') + + // Display the current section + const sectionId = `${event.target.dataset.section}-section` + document.getElementById(sectionId).classList.add('is-shown') + + // Save currently active button in localStorage + const buttonId = event.target.getAttribute('id') + settings.set('activeSectionButtonId', buttonId) +} + +function activateDefaultSection () { + document.getElementById('button-windows').click() +} + +function showMainContent () { + document.querySelector('.js-nav').classList.add('is-shown') + document.querySelector('.js-content').classList.add('is-shown') +} + +function handleModalTrigger (event) { + hideAllModals() + const modalId = `${event.target.dataset.modal}-modal` + document.getElementById(modalId).classList.add('is-shown') +} + +function hideAllModals () { + const modals = document.querySelectorAll('.modal.is-shown') + Array.prototype.forEach.call(modals, (modal) => { + modal.classList.remove('is-shown') + }) + showMainContent() +} + +function hideAllSectionsAndDeselectButtons () { + const sections = document.querySelectorAll('.js-section.is-shown') + Array.prototype.forEach.call(sections, (section) => { + section.classList.remove('is-shown') + }) + + const buttons = document.querySelectorAll('.nav-button.is-selected') + Array.prototype.forEach.call(buttons, (button) => { + button.classList.remove('is-selected') + }) +} + +function displayAbout () { + document.querySelector('#about-modal').classList.add('is-shown') +} + +// Default to the view that was active the last time the app was open +const sectionId = settings.get('activeSectionButtonId') +if (sectionId) { + showMainContent() + const section = document.getElementById(sectionId) + if (section) section.click() +} else { + activateDefaultSection() + displayAbout() +} diff --git a/assets/normalize-shortcuts.js b/assets/normalize-shortcuts.js new file mode 100644 index 0000000..bb29a48 --- /dev/null +++ b/assets/normalize-shortcuts.js @@ -0,0 +1,6 @@ +const normalize = require('electron-shortcut-normalizer') +let shortcuts = document.querySelectorAll('kbd.normalize-to-platform') + +Array.prototype.forEach.call(shortcuts, (shortcut) => { + shortcut.innerText = normalize(shortcut.innerText, process.platform) +}) diff --git a/assets/tiles/SampleAppx.150x150.png b/assets/tiles/SampleAppx.150x150.png new file mode 100644 index 0000000..bb99d9b Binary files /dev/null and b/assets/tiles/SampleAppx.150x150.png differ diff --git a/assets/tiles/SampleAppx.310x150.png b/assets/tiles/SampleAppx.310x150.png new file mode 100644 index 0000000..fdf4109 Binary files /dev/null and b/assets/tiles/SampleAppx.310x150.png differ diff --git a/assets/tiles/SampleAppx.44x44.png b/assets/tiles/SampleAppx.44x44.png new file mode 100644 index 0000000..43e2d2f Binary files /dev/null and b/assets/tiles/SampleAppx.44x44.png differ diff --git a/assets/tiles/SampleAppx.50x50.png b/assets/tiles/SampleAppx.50x50.png new file mode 100644 index 0000000..839fcf3 Binary files /dev/null and b/assets/tiles/SampleAppx.50x50.png differ diff --git a/cli.js b/cli.js new file mode 100644 index 0000000..504f8f9 --- /dev/null +++ b/cli.js @@ -0,0 +1,11 @@ +#!/usr/bin/env node + +const {spawn} = require('child_process') +const electron = require('electron') +const path = require('path') + +const appPath = path.join(__dirname, 'main.js') +const args = [appPath].concat(process.argv.slice(2)) +const proc = spawn(electron, args, {stdio: 'inherit'}) + +proc.on('close', (code) => process.exit(code)) diff --git a/index.html b/index.html new file mode 100644 index 0000000..46db7dd --- /dev/null +++ b/index.html @@ -0,0 +1,28 @@ + + + + + React Native Tutorial + + + + + +
+
+ +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/main-process/communication/async-msg.js b/main-process/communication/async-msg.js new file mode 100644 index 0000000..50b2b3e --- /dev/null +++ b/main-process/communication/async-msg.js @@ -0,0 +1,5 @@ +const {ipcMain} = require('electron') + +ipcMain.on('asynchronous-message', (event, arg) => { + event.sender.send('asynchronous-reply', 'pong') +}) diff --git a/main-process/communication/sync-msg.js b/main-process/communication/sync-msg.js new file mode 100644 index 0000000..fcdd680 --- /dev/null +++ b/main-process/communication/sync-msg.js @@ -0,0 +1,5 @@ +const {ipcMain} = require('electron') + +ipcMain.on('synchronous-message', (event, arg) => { + event.returnValue = 'pong' +}) diff --git a/main-process/menus/application-menu.js b/main-process/menus/application-menu.js new file mode 100644 index 0000000..b543889 --- /dev/null +++ b/main-process/menus/application-menu.js @@ -0,0 +1,240 @@ +const {BrowserWindow, Menu, app, shell, dialog} = require('electron') + +let template = [{ + label: 'Edit', + submenu: [{ + label: 'Undo', + accelerator: 'CmdOrCtrl+Z', + role: 'undo' + }, { + label: 'Redo', + accelerator: 'Shift+CmdOrCtrl+Z', + role: 'redo' + }, { + type: 'separator' + }, { + label: 'Cut', + accelerator: 'CmdOrCtrl+X', + role: 'cut' + }, { + label: 'Copy', + accelerator: 'CmdOrCtrl+C', + role: 'copy' + }, { + label: 'Paste', + accelerator: 'CmdOrCtrl+V', + role: 'paste' + }, { + label: 'Select All', + accelerator: 'CmdOrCtrl+A', + role: 'selectall' + }] +}, { + label: 'View', + submenu: [{ + label: 'Reload', + accelerator: 'CmdOrCtrl+R', + click: (item, focusedWindow) => { + if (focusedWindow) { + // on reload, start fresh and close any old + // open secondary windows + if (focusedWindow.id === 1) { + BrowserWindow.getAllWindows().forEach(win => { + if (win.id > 1) win.close() + }) + } + focusedWindow.reload() + } + } + }, { + label: 'Toggle Full Screen', + accelerator: (() => { + if (process.platform === 'darwin') { + return 'Ctrl+Command+F' + } else { + return 'F11' + } + })(), + click: (item, focusedWindow) => { + if (focusedWindow) { + focusedWindow.setFullScreen(!focusedWindow.isFullScreen()) + } + } + }, { + label: 'Toggle Developer Tools', + accelerator: (() => { + if (process.platform === 'darwin') { + return 'Alt+Command+I' + } else { + return 'Ctrl+Shift+I' + } + })(), + click: (item, focusedWindow) => { + if (focusedWindow) { + focusedWindow.toggleDevTools() + } + } + }, { + type: 'separator' + }, { + label: 'App Menu Demo', + click: function (item, focusedWindow) { + if (focusedWindow) { + const options = { + type: 'info', + title: 'Application Menu Demo', + buttons: ['Ok'], + message: 'This demo is for the Menu section, showing how to create a clickable menu item in the application menu.' + } + dialog.showMessageBox(focusedWindow, options, function () {}) + } + } + }] +}, { + label: 'Window', + role: 'window', + submenu: [{ + label: 'Minimize', + accelerator: 'CmdOrCtrl+M', + role: 'minimize' + }, { + label: 'Close', + accelerator: 'CmdOrCtrl+W', + role: 'close' + }, { + type: 'separator' + }, { + label: 'Reopen Window', + accelerator: 'CmdOrCtrl+Shift+T', + enabled: false, + key: 'reopenMenuItem', + click: () => { + app.emit('activate') + } + }] +}, { + label: 'Help', + role: 'help', + submenu: [{ + label: 'Learn More', + click: () => { + shell.openExternal('http://electron.atom.io') + } + }] +}] + +function addUpdateMenuItems (items, position) { + if (process.mas) return + + const version = app.getVersion() + let updateItems = [{ + label: `Version ${version}`, + enabled: false + }, { + label: 'Checking for Update', + enabled: false, + key: 'checkingForUpdate' + }, { + label: 'Check for Update', + visible: false, + key: 'checkForUpdate', + click: () => { + require('electron').autoUpdater.checkForUpdates() + } + }, { + label: 'Restart and Install Update', + enabled: true, + visible: false, + key: 'restartToUpdate', + click: () => { + require('electron').autoUpdater.quitAndInstall() + } + }] + + items.splice.apply(items, [position, 0].concat(updateItems)) +} + +function findReopenMenuItem () { + const menu = Menu.getApplicationMenu() + if (!menu) return + + let reopenMenuItem + menu.items.forEach(item => { + if (item.submenu) { + item.submenu.items.forEach(item => { + if (item.key === 'reopenMenuItem') { + reopenMenuItem = item + } + }) + } + }) + return reopenMenuItem +} + +if (process.platform === 'darwin') { + const name = app.getName() + template.unshift({ + label: name, + submenu: [{ + label: `About ${name}`, + role: 'about' + }, { + type: 'separator' + }, { + label: 'Services', + role: 'services', + submenu: [] + }, { + type: 'separator' + }, { + label: `Hide ${name}`, + accelerator: 'Command+H', + role: 'hide' + }, { + label: 'Hide Others', + accelerator: 'Command+Alt+H', + role: 'hideothers' + }, { + label: 'Show All', + role: 'unhide' + }, { + type: 'separator' + }, { + label: 'Quit', + accelerator: 'Command+Q', + click: () => { + app.quit() + } + }] + }) + + // Window menu. + template[3].submenu.push({ + type: 'separator' + }, { + label: 'Bring All to Front', + role: 'front' + }) + + addUpdateMenuItems(template[0].submenu, 1) +} + +if (process.platform === 'win32') { + const helpMenu = template[template.length - 1].submenu + addUpdateMenuItems(helpMenu, 0) +} + +app.on('ready', () => { + const menu = Menu.buildFromTemplate(template) + Menu.setApplicationMenu(menu) +}) + +app.on('browser-window-created', () => { + let reopenMenuItem = findReopenMenuItem() + if (reopenMenuItem) reopenMenuItem.enabled = false +}) + +app.on('window-all-closed', () => { + let reopenMenuItem = findReopenMenuItem() + if (reopenMenuItem) reopenMenuItem.enabled = true +}) diff --git a/main-process/menus/context-menu.js b/main-process/menus/context-menu.js new file mode 100644 index 0000000..ebb321c --- /dev/null +++ b/main-process/menus/context-menu.js @@ -0,0 +1,23 @@ +const { + BrowserWindow, + Menu, + MenuItem, + ipcMain, + app +} = require('electron') + +const menu = new Menu() +menu.append(new MenuItem({ label: 'Hello' })) +menu.append(new MenuItem({ type: 'separator' })) +menu.append(new MenuItem({ label: 'Electron', type: 'checkbox', checked: true })) + +app.on('browser-window-created', (event, win) => { + win.webContents.on('context-menu', (e, params) => { + menu.popup(win, params.x, params.y) + }) +}) + +ipcMain.on('show-context-menu', (event) => { + const win = BrowserWindow.fromWebContents(event.sender) + menu.popup(win) +}) diff --git a/main-process/menus/shortcuts.js b/main-process/menus/shortcuts.js new file mode 100644 index 0000000..656da46 --- /dev/null +++ b/main-process/menus/shortcuts.js @@ -0,0 +1,16 @@ +const {app, dialog, globalShortcut} = require('electron') + +app.on('ready', () => { + globalShortcut.register('CommandOrControl+Alt+K', () => { + dialog.showMessageBox({ + type: 'info', + message: 'Success!', + detail: 'You pressed the registered global shortcut keybinding.', + buttons: ['OK'] + }) + }) +}) + +app.on('will-quit', () => { + globalShortcut.unregisterAll() +}) diff --git a/main-process/native-ui/dialogs/error.js b/main-process/native-ui/dialogs/error.js new file mode 100644 index 0000000..4ed0843 --- /dev/null +++ b/main-process/native-ui/dialogs/error.js @@ -0,0 +1,5 @@ +const {ipcMain, dialog} = require('electron') + +ipcMain.on('open-error-dialog', (event) => { + dialog.showErrorBox('An Error Message', 'Demonstrating an error message.') +}) diff --git a/main-process/native-ui/dialogs/information.js b/main-process/native-ui/dialogs/information.js new file mode 100644 index 0000000..5054a1d --- /dev/null +++ b/main-process/native-ui/dialogs/information.js @@ -0,0 +1,13 @@ +const {ipcMain, dialog} = require('electron') + +ipcMain.on('open-information-dialog', (event) => { + const options = { + type: 'info', + title: 'Information', + message: "This is an information dialog. Isn't it nice?", + buttons: ['Yes', 'No'] + } + dialog.showMessageBox(options, (index) => { + event.sender.send('information-dialog-selection', index) + }) +}) diff --git a/main-process/native-ui/dialogs/open-file.js b/main-process/native-ui/dialogs/open-file.js new file mode 100644 index 0000000..1aaf375 --- /dev/null +++ b/main-process/native-ui/dialogs/open-file.js @@ -0,0 +1,11 @@ +const {ipcMain, dialog} = require('electron') + +ipcMain.on('open-file-dialog', (event) => { + dialog.showOpenDialog({ + properties: ['openFile', 'openDirectory'] + }, (files) => { + if (files) { + event.sender.send('selected-directory', files) + } + }) +}) diff --git a/main-process/native-ui/dialogs/save.js b/main-process/native-ui/dialogs/save.js new file mode 100644 index 0000000..b10ed3f --- /dev/null +++ b/main-process/native-ui/dialogs/save.js @@ -0,0 +1,13 @@ +const {ipcMain, dialog} = require('electron') + +ipcMain.on('save-dialog', (event) => { + const options = { + title: 'Save an Image', + filters: [ + { name: 'Images', extensions: ['jpg', 'png', 'gif'] } + ] + } + dialog.showSaveDialog(options, (filename) => { + event.sender.send('saved-file', filename) + }) +}) diff --git a/main-process/native-ui/drag/codeIcon.png b/main-process/native-ui/drag/codeIcon.png new file mode 100644 index 0000000..2dd68b6 Binary files /dev/null and b/main-process/native-ui/drag/codeIcon.png differ diff --git a/main-process/native-ui/drag/drag.js b/main-process/native-ui/drag/drag.js new file mode 100644 index 0000000..1e46f0c --- /dev/null +++ b/main-process/native-ui/drag/drag.js @@ -0,0 +1,10 @@ +const {ipcMain} = require('electron') +const path = require('path') + +ipcMain.on('ondragstart', (event, filepath) => { + const iconName = 'codeIcon.png' + event.sender.startDrag({ + file: filepath, + icon: path.join(__dirname, iconName) + }) +}) diff --git a/main-process/native-ui/tray/iconTemplate.png b/main-process/native-ui/tray/iconTemplate.png new file mode 100644 index 0000000..d56c508 Binary files /dev/null and b/main-process/native-ui/tray/iconTemplate.png differ diff --git a/main-process/native-ui/tray/iconTemplate@2x.png b/main-process/native-ui/tray/iconTemplate@2x.png new file mode 100644 index 0000000..bd30644 Binary files /dev/null and b/main-process/native-ui/tray/iconTemplate@2x.png differ diff --git a/main-process/native-ui/tray/tray.js b/main-process/native-ui/tray/tray.js new file mode 100644 index 0000000..f43dff2 --- /dev/null +++ b/main-process/native-ui/tray/tray.js @@ -0,0 +1,28 @@ +const path = require('path') +const {ipcMain, app, Menu, Tray} = require('electron') + +let appIcon = null + +ipcMain.on('put-in-tray', (event) => { + const iconName = process.platform === 'win32' ? 'windows-icon.png' : 'iconTemplate.png' + const iconPath = path.join(__dirname, iconName) + appIcon = new Tray(iconPath) + + const contextMenu = Menu.buildFromTemplate([{ + label: 'Remove', + click: () => { + event.sender.send('tray-removed') + } + }]) + + appIcon.setToolTip('Electron Demo in the tray.') + appIcon.setContextMenu(contextMenu) +}) + +ipcMain.on('remove-tray', () => { + appIcon.destroy() +}) + +app.on('window-all-closed', () => { + if (appIcon) appIcon.destroy() +}) diff --git a/main-process/native-ui/tray/windows-icon@2x.png b/main-process/native-ui/tray/windows-icon@2x.png new file mode 100644 index 0000000..463f374 Binary files /dev/null and b/main-process/native-ui/tray/windows-icon@2x.png differ diff --git a/main-process/system/app-information.js b/main-process/system/app-information.js new file mode 100644 index 0000000..6b3290d --- /dev/null +++ b/main-process/system/app-information.js @@ -0,0 +1,5 @@ +const {app, ipcMain} = require('electron') + +ipcMain.on('get-app-path', (event) => { + event.sender.send('got-app-path', app.getAppPath()) +}) diff --git a/main-process/system/protocol-handler.js b/main-process/system/protocol-handler.js new file mode 100644 index 0000000..c290e1e --- /dev/null +++ b/main-process/system/protocol-handler.js @@ -0,0 +1,14 @@ +const {app, dialog} = require('electron') +const path = require('path') + +if (process.defaultApp) { + if (process.argv.length >= 2) { + app.setAsDefaultProtocolClient('electron-api-demos', process.execPath, [path.resolve(process.argv[1])]) + } +} else { + app.setAsDefaultProtocolClient('electron-api-demos') +} + +app.on('open-url', (event, url) => { + dialog.showErrorBox('Welcome Back', `You arrived from: ${url}`) +}) diff --git a/main.js b/main.js new file mode 100644 index 0000000..49b20f9 --- /dev/null +++ b/main.js @@ -0,0 +1,94 @@ +require('update-electron-app')({ + logger: require('electron-log') +}) + +const path = require('path') +const glob = require('glob') +const {app, BrowserWindow} = require('electron') + +const debug = /--debug/.test(process.argv[2]) + +if (process.mas) app.setName('Tutorial Player') + +let mainWindow = null + +function initialize () { + makeSingleInstance() + + loadDemos() + + function createWindow () { + const windowOptions = { + width: 1080, + minWidth: 680, + height: 840, + title: app.getName(), + webPreferences: { + nodeIntegration: true + } + } + + if (process.platform === 'linux') { + windowOptions.icon = path.join(__dirname, '/assets/app-icon/png/512.png') + } + + mainWindow = new BrowserWindow(windowOptions) + mainWindow.setMenuBarVisibility(false) + mainWindow.loadURL(path.join('file://', __dirname, '/index.html')) + + // Launch fullscreen with DevTools open, usage: npm run debug + if (debug) { + mainWindow.webContents.openDevTools() + mainWindow.maximize() + require('devtron').install() + } + + mainWindow.on('closed', () => { + mainWindow = null + }) + } + + app.on('ready', () => { + createWindow() + }) + + app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit() + } + }) + + app.on('activate', () => { + if (mainWindow === null) { + createWindow() + } + }) +} + +// Make this app a single instance app. +// +// The main window will be restored and focused instead of a second window +// opened when a person attempts to launch a second instance. +// +// Returns true if the current version of the app should quit instead of +// launching. +function makeSingleInstance () { + if (process.mas) return + + app.requestSingleInstanceLock() + + app.on('second-instance', () => { + if (mainWindow) { + if (mainWindow.isMinimized()) mainWindow.restore() + mainWindow.focus() + } + }) +} + +// Require each JS file in the main-process dir +function loadDemos () { + const files = glob.sync(path.join(__dirname, 'main-process/**/*.js')) + files.forEach((file) => { require(file) }) +} + +initialize() diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4931cfc --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4978 @@ +{ + "name": "electron-api-demos", + "version": "2.0.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@octokit/endpoint": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-3.1.1.tgz", + "integrity": "sha512-KPkoTvKwCTetu/UqonLs1pfwFO5HAqTv/Ksp9y4NAg//ZgUCpvJsT4Hrst85uEzJvkB8+LxKyR4Bfv2X8O4cmQ==", + "dev": true, + "requires": { + "deepmerge": "3.0.0", + "is-plain-object": "^2.0.4", + "universal-user-agent": "^2.0.1", + "url-template": "^2.0.8" + }, + "dependencies": { + "deepmerge": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.0.0.tgz", + "integrity": "sha512-a8z8bkgHsAML+uHLqmMS83HHlpy3PvZOOuiTQqaa3wu8ZVg3h0hqHk6aCsGdOnZV2XMM/FRimNGjUh0KCcmHBw==", + "dev": true + } + } + }, + "@octokit/request": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-2.2.1.tgz", + "integrity": "sha512-enwbVOl3vWWIUuEj0LJRq+mxWNyv95fa13GJitz7qGt/ycYCwtSoVssW3pCqvxS4GlJfHfO2OA+8czIcEF522A==", + "dev": true, + "requires": { + "@octokit/endpoint": "^3.1.1", + "is-plain-object": "^2.0.4", + "node-fetch": "^2.3.0", + "universal-user-agent": "^2.0.1" + } + }, + "@octokit/rest": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.3.2.tgz", + "integrity": "sha512-g1Shr7Bp5K3+o1VdUvQn//8ZIAFFODBi9GFdx4eqV2qZQtWwy28jmCGuS+CphnCj8PlQbFmZtXvmUh5xIRGFcA==", + "dev": true, + "requires": { + "@octokit/request": "2.2.1", + "before-after-hook": "^1.2.0", + "btoa-lite": "^1.0.0", + "lodash.get": "^4.4.2", + "lodash.pick": "^4.4.0", + "lodash.set": "^4.3.2", + "lodash.uniq": "^4.5.0", + "octokit-pagination-methods": "^1.1.0", + "universal-user-agent": "^2.0.0", + "url-template": "^2.0.8" + } + }, + "@types/node": { + "version": "10.14.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.6.tgz", + "integrity": "sha512-Fvm24+u85lGmV4hT5G++aht2C5I4Z4dYlWZIh62FAfFO/TfzXtPpoLI6I7AuBWkIFqZCnhFOoTT7RjjaIL5Fjg==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accessibility-developer-tools": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz", + "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", + "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.2.tgz", + "integrity": "sha512-rUe9SxpRQlVg4EM8It7JMNWWYHAirTPpbTuvaSKybb5IejNgWB3PGBBX9rrPKDx2pM/p3Wh+7+ASaWRyyAbxmQ==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, + "archiver": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", + "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=", + "dev": true, + "requires": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "zip-stream": "^1.2.0" + }, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asar": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/asar/-/asar-0.14.5.tgz", + "integrity": "sha512-2Di/TnY1sridHFKMFgxBh0Wk0gVxSZN4qQhRhjJn3UywZAvP5MHI0RNVSkpzmJ+n6t0BC8w/+1257wtSgQ3Kdg==", + "dev": true, + "requires": { + "chromium-pickle-js": "^0.2.0", + "commander": "^2.9.0", + "cuint": "^0.2.1", + "glob": "^6.0.4", + "minimatch": "^3.0.3", + "mkdirp": "^0.5.0", + "mksnapshot": "^0.3.0", + "tmp": "0.0.28" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "async": { + "version": "0.9.2", + "resolved": "http://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "author-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "before-after-hook": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.3.1.tgz", + "integrity": "sha512-BIjg60OP/sQvG7Q2L9Xkc77gyyFw1B4T73LIfZVQtXbutJinC1+t2HRl4qeR3EWAmY+tA6z9vpRi02q6ZXyluQ==", + "dev": true + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dev": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "bl": { + "version": "1.2.2", + "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", + "dev": true + }, + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chai": { + "version": "3.5.0", + "resolved": "http://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, + "chai-as-promised": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-6.0.0.tgz", + "integrity": "sha1-GgKkM6byTa+sY7nJb6FoTbGqjaY=", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dev": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "check-for-leaks": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/check-for-leaks/-/check-for-leaks-1.2.1.tgz", + "integrity": "sha512-9OdOSRZY6N0w5JCdJpqsC5MkD6EPGYpHmhtf4l5nl3DRETDZshP6C1EGN/vVhHDTY6AsOK3NhdFfrMe3NWZl7g==", + "dev": true, + "requires": { + "anymatch": "^3.0.2", + "minimist": "^1.2.0", + "parse-gitignore": "^0.4.0", + "walk-sync": "^0.3.2" + } + }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", + "dev": true + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", + "dev": true + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "dev": true + }, + "compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" + } + }, + "css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=", + "dev": true + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "debug-log": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-zip": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.2.tgz", + "integrity": "sha512-Ab1QY4LrWMrUuo53lLnmGOby7v8ryqxJ+bKibKSiPisx+25mhut1dScVBXAYx14i/PqSrFZvR2FRRazhLbvL+g==", + "dev": true, + "requires": { + "binary": "^0.3.0", + "graceful-fs": "^4.1.3", + "mkpath": "^0.1.0", + "nopt": "^3.0.1", + "q": "^1.1.2", + "readable-stream": "^1.1.8", + "touch": "0.0.3" + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "http://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "deep-equal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", + "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.0.1.tgz", + "integrity": "sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + }, + "dependencies": { + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + } + } + }, + "deglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", + "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", + "dev": true, + "requires": { + "find-root": "^1.0.0", + "glob": "^7.0.5", + "ignore": "^3.0.9", + "pkg-config": "^1.1.0", + "run-parallel": "^1.1.2", + "uniq": "^1.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "dev-null": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz", + "integrity": "sha1-WiBc48Ky73e2I41roXnrdMag6Bg=", + "dev": true + }, + "devtron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/devtron/-/devtron-1.4.0.tgz", + "integrity": "sha1-tedIvW6Vu+cL/MaKrm/mlhGUQeE=", + "dev": true, + "requires": { + "accessibility-developer-tools": "^2.11.0", + "highlight.js": "^9.3.0", + "humanize-plus": "^1.8.1" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "doctrine": { + "version": "1.5.0", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ejs": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz", + "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==", + "dev": true + }, + "electron": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-5.0.1.tgz", + "integrity": "sha512-8KksyhAPcpXVeO8ViVGxfZAuf8yEVBCtV0h/lMBD8VFbCQ9icej1K5csCFAGirbZbqOz5IdsBZX9Gpb9n4RCag==", + "requires": { + "@types/node": "^10.12.18", + "electron-download": "^4.1.0", + "extract-zip": "^1.0.3" + } + }, + "electron-chromedriver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/electron-chromedriver/-/electron-chromedriver-3.0.0.tgz", + "integrity": "sha512-xWivZRiPTtDFJt+qXv7Ax/Dmhxj0iqESOxoLZ2szu3fv6k1vYDUDJUMHfdfVAke9D2gBRIgChuGb5j3YEt6hxQ==", + "dev": true, + "requires": { + "electron-download": "^4.1.0", + "extract-zip": "^1.6.5" + } + }, + "electron-download": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", + "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==", + "requires": { + "debug": "^3.0.0", + "env-paths": "^1.0.0", + "fs-extra": "^4.0.1", + "minimist": "^1.2.0", + "nugget": "^2.0.1", + "path-exists": "^3.0.0", + "rc": "^1.2.1", + "semver": "^5.4.1", + "sumchecker": "^2.0.2" + } + }, + "electron-is-dev": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz", + "integrity": "sha1-FOb9pcaOnk7L7/nM8DfL18BcWv4=" + }, + "electron-log": { + "version": "2.2.17", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-2.2.17.tgz", + "integrity": "sha512-v+Af5W5z99ehhaLOfE9eTSXUwjzh2wFlQjz51dvkZ6ZIrET6OB/zAZPvsuwT6tm3t5x+M1r+Ed3U3xtPZYAyuQ==" + }, + "electron-osx-sign": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.11.tgz", + "integrity": "sha512-VVd40nrnVqymvFrY9ZkOYgHJOvexHHYTR3di/SN+mjJ0OWhR1I8BRVj3U+Yamw6hnkZZNKZp52rqL5EFAAPFkQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "compare-version": "^0.1.2", + "debug": "^2.6.8", + "isbinaryfile": "^3.0.2", + "minimist": "^1.2.0", + "plist": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "dev": true, + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + } + } + } + }, + "electron-packager": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-12.2.0.tgz", + "integrity": "sha512-T5W/FIK4VXhYIOWxkehmz6zXt2S/sA9JZ3AL+/jeKCicQY6QVQ0K8B7W801L+GPTwbgTPycHjO+iqEf1BhZ+Iw==", + "dev": true, + "requires": { + "asar": "^0.14.0", + "debug": "^3.0.0", + "electron-download": "^4.1.1", + "electron-osx-sign": "^0.4.1", + "extract-zip": "^1.0.3", + "fs-extra": "^5.0.0", + "galactus": "^0.2.1", + "get-package-info": "^1.0.0", + "nodeify": "^1.0.1", + "parse-author": "^2.0.0", + "pify": "^3.0.0", + "plist": "^2.0.0", + "rcedit": "^1.0.0", + "resolve": "^1.1.6", + "sanitize-filename": "^1.6.0", + "semver": "^5.3.0", + "yargs-parser": "^10.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "electron-settings": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-settings/-/electron-settings-3.2.0.tgz", + "integrity": "sha512-7U+vDKd5Gch4Z9K6FjGq80eB3Anwz2GuPc2h/6hOiuvZrS1w+UNPcAA0oAU8G1s9sWAVEadCsr4ZJR6J4iTdzA==", + "requires": { + "clone": "^2.1.1", + "jsonfile": "^4.0.0" + } + }, + "electron-shortcut-normalizer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/electron-shortcut-normalizer/-/electron-shortcut-normalizer-1.0.0.tgz", + "integrity": "sha1-juKEs47f6jd0Qpj5PQF9hZJNIgA=" + }, + "electron-winstaller": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-2.7.0.tgz", + "integrity": "sha512-WKRUTyGzTQbM2Q6dYm/iQqdYRQRTMiFakPxqOCJrH29YPVelGG9vNldal68fnq2yL+FFsoQi/3+qb6jDk143mw==", + "dev": true, + "requires": { + "asar": "^0.11.0", + "bluebird": "^3.3.4", + "debug": "^2.2.0", + "fs-extra": "^2.1.2", + "lodash.template": "^4.2.2", + "temp": "^0.8.3" + }, + "dependencies": { + "asar": { + "version": "0.11.0", + "resolved": "http://registry.npmjs.org/asar/-/asar-0.11.0.tgz", + "integrity": "sha1-uSbnksMV+MBIxDNx4yWwnJenZGQ=", + "dev": true, + "requires": { + "chromium-pickle-js": "^0.1.0", + "commander": "^2.9.0", + "cuint": "^0.2.1", + "glob": "^6.0.4", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "mksnapshot": "^0.3.0" + } + }, + "chromium-pickle-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.1.0.tgz", + "integrity": "sha1-HUixB9ghJqLz4hHC6iX4A7pVGyE=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" + } + }, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "ensure-posix-path": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz", + "integrity": "sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==", + "dev": true + }, + "env-paths": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.46", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", + "integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint": { + "version": "3.10.2", + "resolved": "http://registry.npmjs.org/eslint/-/eslint-3.10.2.tgz", + "integrity": "sha1-yaEOi/bp1lZRIEd4xQM0Hx6sPOc=", + "dev": true, + "requires": { + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.4.6", + "debug": "^2.1.1", + "doctrine": "^1.2.2", + "escope": "^3.6.0", + "espree": "^3.3.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.2.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~1.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "inquirer": { + "version": "0.12.0", + "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "^1.3.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "eslint-config-standard": { + "version": "6.2.1", + "resolved": "http://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-6.2.1.tgz", + "integrity": "sha1-06aKr8cZFjnn7kQec0hzkCY1QpI=", + "dev": true + }, + "eslint-config-standard-jsx": { + "version": "3.2.0", + "resolved": "http://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.2.0.tgz", + "integrity": "sha1-wkDibtkZoRpCqk3oBZRys4Jo1iA=", + "dev": true + }, + "eslint-plugin-promise": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.4.2.tgz", + "integrity": "sha1-G+J5Pq/i0YtbEjuBNsJp+AT+cSI=", + "dev": true + }, + "eslint-plugin-react": { + "version": "6.7.1", + "resolved": "http://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.7.1.tgz", + "integrity": "sha1-Gvlq6lRYVoJRV9l8G1DVqPtkpac=", + "dev": true, + "requires": { + "doctrine": "^1.2.2", + "jsx-ast-utils": "^1.3.3" + } + }, + "eslint-plugin-standard": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-2.0.1.tgz", + "integrity": "sha1-NYlpn/nJF/LCX3apFmh/ZBw2n/M=", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "external-editor": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "dependencies": { + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } + } + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } + }, + "flora-colossus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-1.0.0.tgz", + "integrity": "sha1-VHKcNh7ezuAU3UQWeeGjfB13OkU=", + "dev": true, + "requires": { + "debug": "^3.1.0", + "fs-extra": "^4.0.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "galactus": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/galactus/-/galactus-0.2.1.tgz", + "integrity": "sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk=", + "dev": true, + "requires": { + "debug": "^3.1.0", + "flora-colossus": "^1.0.0", + "fs-extra": "^4.0.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "requires": { + "is-property": "^1.0.2" + } + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-package-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", + "integrity": "sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw=", + "dev": true, + "requires": { + "bluebird": "^3.1.1", + "debug": "^2.2.0", + "lodash.get": "^4.0.0", + "read-pkg-up": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "github-url-to-object": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/github-url-to-object/-/github-url-to-object-4.0.4.tgz", + "integrity": "sha512-1Ri1pR8XTfzLpbtPz5MlW/amGNdNReuExPsbF9rxLsBfO1GH9RtDBamhJikd0knMWq3RTTQDbTtw0GGvvEAJEA==", + "requires": { + "is-url": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "highlight.js": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.13.1.tgz", + "integrity": "sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A==" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "humanize-plus": { + "version": "1.8.2", + "resolved": "http://registry.npmjs.org/humanize-plus/-/humanize-plus-1.8.2.tgz", + "integrity": "sha1-pls0RZrWNnrbs3B6gqPJ+RYWcDA=", + "dev": true + }, + "husky": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", + "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", + "dev": true, + "requires": { + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + } + } + }, + "i": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", + "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "is-my-json-valid": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz", + "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==", + "dev": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-promise": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", + "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", + "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", + "dev": true + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", + "dev": true + }, + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "dev": true, + "requires": { + "lodash._reinterpolate": "~3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "dev": true, + "requires": { + "lodash._reinterpolate": "~3.0.0" + } + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "macos-release": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.0.0.tgz", + "integrity": "sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A==", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "matcher-collection": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-1.1.2.tgz", + "integrity": "sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g==", + "dev": true, + "requires": { + "minimatch": "^3.0.2" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "mkpath": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", + "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=", + "dev": true + }, + "mksnapshot": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mksnapshot/-/mksnapshot-0.3.5.tgz", + "integrity": "sha512-PSBoZaj9h9myC3uRRW62RxmX8mrN3XbOkMEyURUD7v5CeJgtYTar50XU738t7Q0LtG1pBPtp5n5QwDGggRnEvw==", + "dev": true, + "requires": { + "decompress-zip": "0.3.x", + "fs-extra": "0.26.7", + "request": "2.x" + }, + "dependencies": { + "fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ncp": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz", + "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", + "dev": true + }, + "nodeify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nodeify/-/nodeify-1.0.1.tgz", + "integrity": "sha1-ZKtpp7268DzhB7TwM1yHwLnpGx0=", + "dev": true, + "requires": { + "is-promise": "~1.0.0", + "promise": "~1.3.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-install-package": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/npm-install-package/-/npm-install-package-2.1.0.tgz", + "integrity": "sha1-1+/jz816sAYUuJbqUxGdyaslkSU=", + "dev": true + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nugget": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", + "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", + "requires": { + "debug": "^2.1.3", + "minimist": "^1.1.0", + "pretty-bytes": "^1.0.2", + "progress-stream": "^1.1.0", + "request": "^2.45.0", + "single-line-log": "^1.1.2", + "throttleit": "0.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, + "octokit-pagination-methods": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", + "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.0.0.tgz", + "integrity": "sha512-7c74tib2FsdFbQ3W+qj8Tyd1R3Z6tuVRNNxXjJcZ4NgjIEQU9N/prVMqcW29XZPXGACqaXN3jq58/6hoaoXH6g==", + "dev": true, + "requires": { + "macos-release": "^2.0.0", + "windows-release": "^3.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-author": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=", + "dev": true, + "requires": { + "author-regex": "^1.0.0" + } + }, + "parse-gitignore": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-0.4.0.tgz", + "integrity": "sha1-q/cC5LkAUk//eQK2g4YoV7Y/k/4=", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "is-glob": "^3.1.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true + }, + "pidtree": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", + "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", + "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", + "dev": true, + "requires": { + "debug-log": "^1.0.0", + "find-root": "^1.0.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "pkginfo": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", + "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=", + "dev": true + }, + "plist": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz", + "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=", + "dev": true, + "requires": { + "base64-js": "1.2.0", + "xmlbuilder": "8.2.2", + "xmldom": "0.1.x" + }, + "dependencies": { + "base64-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", + "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=", + "dev": true + }, + "xmlbuilder": { + "version": "8.2.2", + "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", + "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=", + "dev": true + } + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.1.0" + } + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "progress": { + "version": "1.1.8", + "resolved": "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "progress-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", + "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", + "requires": { + "speedometer": "~0.1.2", + "through2": "~0.2.3" + } + }, + "promise": { + "version": "1.3.0", + "resolved": "http://registry.npmjs.org/promise/-/promise-1.3.0.tgz", + "integrity": "sha1-5cyaTIJ45GZP/twBx9qEhCsEAXU=", + "dev": true, + "requires": { + "is-promise": "~1" + } + }, + "prompt": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz", + "integrity": "sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=", + "dev": true, + "requires": { + "colors": "^1.1.2", + "pkginfo": "0.x.x", + "read": "1.0.x", + "revalidator": "0.1.x", + "utile": "0.3.x", + "winston": "2.1.x" + } + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "rcedit": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-1.1.1.tgz", + "integrity": "sha512-6NjOhOpkvbc/gpMEfk2hpXuWyHfbLFN8as5jx3jf4bhELvouRoYvc8d/W3NVVPwEBF1ICfbpwp1oRm8OJ2WDWw==", + "dev": true + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "mute-stream": "0.0.5" + }, + "dependencies": { + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "revalidator": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", + "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=", + "dev": true + }, + "rgb2hex": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.9.tgz", + "integrity": "sha512-32iuQzhOjyT+cv9aAFRBJ19JgHwzQwbjUhH3Fj2sWW2EEGAW8fpFrDFP5ndoKDxJaLO06x1hE3kyuIFrUQtybQ==", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + }, + "dependencies": { + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + } + } + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sanitize-filename": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.1.tgz", + "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "signcode": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/signcode/-/signcode-0.5.0.tgz", + "integrity": "sha1-/bv+n892ThY1TCiyyZAwfsgkheA=", + "dev": true, + "requires": { + "prompt": "^1.0.0", + "yargs": "^4.6.0" + } + }, + "single-line-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", + "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", + "requires": { + "string-width": "^1.0.1" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", + "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", + "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==" + }, + "spectron": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/spectron/-/spectron-5.0.0.tgz", + "integrity": "sha512-wJrFe8EZ7xvarYawBPd1pDegmSz81U1jG0rSCx+yXqD1TISUH9ASB21KysLXkPylAnc2vhbpGiWQxrqVFtsiJg==", + "dev": true, + "requires": { + "dev-null": "^0.1.1", + "electron-chromedriver": "~3.0.0", + "request": "^2.87.0", + "split": "^1.0.0", + "webdriverio": "^4.13.0" + } + }, + "speedometer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=" + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", + "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "standard": { + "version": "8.6.0", + "resolved": "http://registry.npmjs.org/standard/-/standard-8.6.0.tgz", + "integrity": "sha1-Y1Eyvnv7VnwpIQBfMPnjUOR1Kq0=", + "dev": true, + "requires": { + "eslint": "~3.10.2", + "eslint-config-standard": "6.2.1", + "eslint-config-standard-jsx": "3.2.0", + "eslint-plugin-promise": "~3.4.0", + "eslint-plugin-react": "~6.7.1", + "eslint-plugin-standard": "~2.0.1", + "standard-engine": "~5.2.0" + } + }, + "standard-engine": { + "version": "5.2.0", + "resolved": "http://registry.npmjs.org/standard-engine/-/standard-engine-5.2.0.tgz", + "integrity": "sha1-QAZgrlrM6K/U22D/IhSpGQrXkKM=", + "dev": true, + "requires": { + "deglob": "^2.0.0", + "find-root": "^1.0.0", + "get-stdin": "^5.0.1", + "home-or-tmp": "^2.0.0", + "minimist": "^1.1.0", + "pkg-config": "^1.0.1" + }, + "dependencies": { + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "sumchecker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "3.8.3", + "resolved": "http://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", + "slice-ansi": "0.0.4", + "string-width": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=" + }, + "through": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "0.2.3", + "resolved": "http://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", + "requires": { + "readable-stream": "~1.1.9", + "xtend": "~2.1.1" + } + }, + "tmp": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", + "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, + "touch": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz", + "integrity": "sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0=", + "dev": true, + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "universal-user-agent": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.0.2.tgz", + "integrity": "sha512-nOwvHWLH3dBazyuzbECPA5uVFNd7AlgviXRHgR4yf48QqitIvpdncRrxMbZNMpPPEfgz30I9ubd1XmiJiqsTrg==", + "dev": true, + "requires": { + "os-name": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "update-electron-app": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/update-electron-app/-/update-electron-app-1.3.0.tgz", + "integrity": "sha512-OXfcmeenpjMyzXmadZ6NqxnrpPpiLji0sLUpXkexfX97XM8Gnk4iLovk4TlK4N8dzlETWdm9klgMmo9HpRbK7Q==", + "requires": { + "electron-is-dev": "^0.3.0", + "github-url-to-object": "^4.0.4", + "is-url": "^1.2.4", + "ms": "^2.1.1" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", + "dev": true + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utile": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz", + "integrity": "sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=", + "dev": true, + "requires": { + "async": "~0.9.0", + "deep-equal": "~0.2.1", + "i": "0.3.x", + "mkdirp": "0.x.x", + "ncp": "1.0.x", + "rimraf": "2.x.x" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "walk-sync": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-0.3.4.tgz", + "integrity": "sha512-ttGcuHA/OBnN2pcM6johpYlEms7XpO5/fyKIr48541xXedan4roO8cS1Q2S/zbbjGH/BarYDAMeS2Mi9HE5Tig==", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.0", + "matcher-collection": "^1.0.0" + } + }, + "wdio-dot-reporter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/wdio-dot-reporter/-/wdio-dot-reporter-0.0.10.tgz", + "integrity": "sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg==", + "dev": true + }, + "webdriverio": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.14.0.tgz", + "integrity": "sha512-642Iqp9en2hvuVINkTfQvWoQCaLb6zJyLHgQFUFLx7s+8l8GnrHzMjkv5DbecZHwnBkhybpphbTW7k0B2ARH5A==", + "dev": true, + "requires": { + "archiver": "~2.1.0", + "babel-runtime": "^6.26.0", + "css-parse": "^2.0.0", + "css-value": "~0.0.1", + "deepmerge": "~2.0.1", + "ejs": "~2.5.6", + "gaze": "~1.1.2", + "glob": "~7.1.1", + "grapheme-splitter": "^1.0.2", + "inquirer": "~3.3.0", + "json-stringify-safe": "~5.0.1", + "mkdirp": "~0.5.1", + "npm-install-package": "~2.1.0", + "optimist": "~0.6.1", + "q": "~1.5.0", + "request": "^2.83.0", + "rgb2hex": "^0.1.9", + "safe-buffer": "~5.1.1", + "supports-color": "~5.0.0", + "url": "~0.11.0", + "wdio-dot-reporter": "~0.0.8", + "wgxpath": "~1.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.0.1.tgz", + "integrity": "sha512-7FQGOlSQ+AQxBNXJpVDj8efTA/FtyB5wcNE1omXXJ0cq6jm1jjDwuROlYDbnzHqdNPqliWFhcioCWSyav+xBnA==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, + "wgxpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wgxpath/-/wgxpath-1.0.0.tgz", + "integrity": "sha1-7vikudVYzEla06mit1FZfs2a9pA=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + }, + "windows-release": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.1.0.tgz", + "integrity": "sha512-hBb7m7acFgQPQc222uEQTmdcGLeBmQLNLFIh0rDk3CwFOBrfjefLzEfEfmpMq8Af/n/GnFf3eYf203FY1PmudA==", + "dev": true, + "requires": { + "execa": "^0.10.0" + } + }, + "winston": { + "version": "2.1.1", + "resolved": "http://registry.npmjs.org/winston/-/winston-2.1.1.tgz", + "integrity": "sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=", + "dev": true, + "requires": { + "async": "~1.0.0", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "pkginfo": "0.3.x", + "stack-trace": "0.0.x" + }, + "dependencies": { + "async": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "pkginfo": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=", + "dev": true + } + } + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "~0.4.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "4.8.1", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", + "dev": true, + "requires": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + } + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "requires": { + "fd-slicer": "~1.0.1" + } + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "dev": true, + "requires": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1c522a5 --- /dev/null +++ b/package.json @@ -0,0 +1,69 @@ +{ + "name": "tutorial-player", + "productName": "Tutorial Player", + "version": "0.1", + "description": "Tutorial Player", + "main": "main.js", + "bin": "cli.js", + "scripts": { + "start": "electron .", + "dev": "electron . --debug", + "test": "mocha && standard", + "package": "npm-run-all package:*", + "package:mac": "electron-packager . --overwrite --platform=darwin --arch=x64 --out=out --icon=assets/app-icon/mac/app.icns --osx-sign.identity='Developer ID Application: GitHub' --extend-info=assets/mac/info.plist", + "package:win": "electron-packager . --overwrite --platform=win32 --arch=ia32 --out=out --icon=assets/app-icon/win/app.ico --executable-name=tutorial-player.exe", + "package:linux": "electron-packager . --overwrite --platform=linux --arch=x64 --out=out", + "package:sign-exe": "signcode './out/Electron API Demos-win32-ia32/Electron API Demos.exe' --cert ~/electron-api-demos.p12 --prompt --name 'Electron API Demos' --url 'http://electron.atom.io'", + "package:installer": "node ./script/installer.js", + "package:sign-installer": "signcode './out/windows-installer/ElectronAPIDemosSetup.exe' --cert ~/electron-api-demos.p12 --prompt --name 'Electron API Demos' --url 'http://electron.atom.io'", + "xpackage:mas": "./script/mas.sh", + "windows-store": "node ./script/windows-store.js", + "release": "node ./script/release.js", + "prepack": "check-for-leaks", + "prepush": "check-for-leaks" + }, + "repository": "https://github.com/electron/electron-api-demos", + "keywords": [ + "Electron", + "API", + "demo" + ], + "author": "GitHub", + "license": "MIT", + "devDependencies": { + "@octokit/rest": "^16.3.2", + "chai": "^3.4.1", + "chai-as-promised": "^6.0.0", + "check-for-leaks": "^1.2.1", + "devtron": "^1.3.0", + "electron-packager": "^12.1.0", + "electron-winstaller": "^2.2.0", + "husky": "^0.14.3", + "mocha": "^5.2.0", + "npm-run-all": "^4.0.2", + "request": "^2.70.0", + "rimraf": "^2.5.2", + "signcode": "^0.5.0", + "spectron": "^5.0.0", + "standard": "^8.2.0" + }, + "dependencies": { + "electron": "^5.0.1", + "electron-log": "^2.2.14", + "electron-settings": "^3.0.7", + "electron-shortcut-normalizer": "^1.0.0", + "glob": "^7.1.0", + "highlight.js": "^9.3.0", + "update-electron-app": "^1.1.1" + }, + "standard": { + "env": { + "mocha": true + } + }, + "build": { + "directories": { + "buildResources": "resources2" + } + } +} diff --git a/player/custom.css b/player/custom.css new file mode 100644 index 0000000..0c1772d --- /dev/null +++ b/player/custom.css @@ -0,0 +1,11 @@ +.tutorial-player { + width: 50%;} + .tutorial-player .list-wrapper { + width: 100%; } + .tutorial-player .list-wrapper .list{ + font-size: 12pt; + padding: 3px; + width: 100%;} + .tutorial-player .player-wrapper { + width: 100%; + } diff --git a/player/custom.js b/player/custom.js new file mode 100644 index 0000000..6da8e4c --- /dev/null +++ b/player/custom.js @@ -0,0 +1,99 @@ +document.ready = function (callback) { + if (typeof callback === 'function') { + var onceCalled = false; + document.addEventListener("DOMContentLoaded", function (event) { + if (!onceCalled) { + onceCalled = true; + callback(event); + } + }); + document.onreadystatechange = function (event) { + if (document.readyState == "interactive") { + if (!onceCalled) { + onceCalled = true; + callback(event); + } + } + } + } +}; + +var Player = function () { + var _play = function (index) { + video_player.src = 'D:/torrent-downloads/react-native-26G/ReactNativeCourse(2nd)/videos/files/' + mp4_files[index] + playerCaption.src = 'D:/torrent-downloads/react-native-26G/ReactNativeCourse(2nd)/videos/files/' + vtt_files[index] + video_player.textTracks[0].mode = 'showing'; + + video_player.play(); + } + return { + play: _play + } +}(); + +var TutorialList = function () { + var _validateTitle = function (title) { + var ret = title; + ret = ret.replace(/\.vtt/gi, ''); + return ret.replace(/\-/gi, ' '); + }; + + var _load = function(){ + + }; + + var _load_list = function(){ + const dialog = require('electron').remote.dialog + const files = dialog.showOpenDialog(null, { + properties: [ 'openDirectory' ], + defaultPath: '.' + }) + console.log(files); + }; + + var _load_html = function () { + + var temp_vtt_file_dir = ''; + var optionNode; + + optionNode = document.createElement('option') + optionNode.value = '' + optionNode.innerHTML = "Select a video to play" + tutorialList.appendChild(optionNode) + + for (var k in vtt_files) { + var vtt_file = vtt_files[k] + var vtt_file_dir = vtt_file.split(/\//gi)[0] + + if (vtt_file_dir != temp_vtt_file_dir) { + optionNode = document.createElement('optgroup') + optionNode.label = _validateTitle(vtt_file_dir) + tutorialList.appendChild(optionNode) + } + + optionNode = document.createElement('option') + optionNode.value = k + optionNode.innerHTML = _validateTitle(vtt_file.replace(vtt_file_dir + "/", '   ')) + tutorialList.appendChild(optionNode) + temp_vtt_file_dir = vtt_file_dir + } + + tutorialList.appendChild(optionNode) + } + return { + load: _load + } +}(); + + + +document.ready(function (event) { + TutorialList.load() + tutorialList.addEventListener('change', function (e) { + Player.play(e.target.value) + }); + +}); + + + diff --git a/player/list_mp4.js b/player/list_mp4.js new file mode 100644 index 0000000..f59d83c --- /dev/null +++ b/player/list_mp4.js @@ -0,0 +1,310 @@ +var mp4_files = [ + "01.-Intro/01.-Introduction.mp4", + "01.-Intro/02.-What-is-React-Native-.mp4", + "01.-Intro/03.-Starting-with-RN.mp4", + "01.-Intro/04.-Installing-tools-(-MAC-USERS-).mp4", + "01.-Intro/05.-Installing-tools-(-WINDOWS-USERS-).mp4", + "01.-Intro/06.-Installing-ANDROID-STUDIO-(-Mac-and-Win-users-).mp4", + "02.-Running-apps-on-simulators/01.-Running-on-Expo.mp4", + "02.-Running-apps-on-simulators/02.-Ejecting-expo-apps.mp4", + "02.-Running-apps-on-simulators/03.-Running-Android-simulator-(-WIN-and-MAC-users-).mp4", + "02.-Running-apps-on-simulators/04.-Windows-environment-variables-(-WIN-users-).mp4", + "02.-Running-apps-on-simulators/05.-Running-IOS-simulator-(-MAC-users-).mp4", + "03.-Starting-with-react-native/01.-First-look-at-the-structure.mp4", + "03.-Starting-with-react-native/02.-Styles,-Views-and-Text.mp4", + "03.-Starting-with-react-native/03.-Components-and-State.mp4", + "03.-Starting-with-react-native/04.-Buttons-and-touch-events.mp4", + "03.-Starting-with-react-native/05.-More-on-touchables.mp4", + "03.-Starting-with-react-native/06.-Handling-inputs.mp4", + "03.-Starting-with-react-native/07.-Adding-users-to-the-list.mp4", + "03.-Starting-with-react-native/08.-Using-the-Scrollview.mp4", + "03.-Starting-with-react-native/09.-The-picker-component.mp4", + "03.-Starting-with-react-native/10.-The-Slider-component-(-0.58.6-).mp4", + "03.-Starting-with-react-native/11.-Activity-indicator.mp4", + "03.-Starting-with-react-native/12.-Working-with-images.mp4", + "03.-Starting-with-react-native/13.-Using-Modals.mp4", + "04.-React-Navigation/01.-Intro-to-react-navigation.mp4", + "04.-React-Navigation/02.-Installing-R.Navigation-and-running-Sim.mp4", + "04.-React-Navigation/03.-Stack-navigator-and-linking-screens.mp4", + "04.-React-Navigation/04.-Navigation-params.mp4", + "04.-React-Navigation/05.-Customizing-the-Header-Bar.mp4", + "04.-React-Navigation/06.-Adding-logos-to-headers.mp4", + "04.-React-Navigation/07.-Creating-a-Side-drawer.mp4", + "04.-React-Navigation/08.-More-on-Side-drawer.mp4", + "04.-React-Navigation/09.-Custom-component-for-Side-drawer.mp4", + "04.-React-Navigation/10.-Creating-a-bottom-Navigation.mp4", + "04.-React-Navigation/11.-Tab-Navigation-Options.mp4", + "04.-React-Navigation/12.-Combining-navigation-types..mp4", + "05.-Using-phone-resources/01.-Installing-Image-picker-(-link-).mp4", + "05.-Using-phone-resources/02.-If-image-picker-fails,-manual-install.mp4", + "05.-Using-phone-resources/03.-Using-camera-and-photo-library.mp4", + "05.-Using-phone-resources/04.-Installing-RNative-contacts.mp4", + "05.-Using-phone-resources/05.-Getting-contacts.mp4", + "05.-Using-phone-resources/06.-Adding-contact-and-opening-form.mp4", + "05.-Using-phone-resources/07.-installing-RNative-vector-icons.mp4", + "05.-Using-phone-resources/08.-Using-RNative-vector-icons.mp4", + "06.-Other-RN-aspects/01.-React-native-debugger.mp4", + "06.-Other-RN-aspects/02.-Reusing-components-and-styles.mp4", + "06.-Other-RN-aspects/03.-More-on-the-platform.mp4", + "06.-Other-RN-aspects/04.-Dimensions.mp4", + "06.-Other-RN-aspects/05.-Device-info-3rd-party-library.mp4", + "07.-Aminations/01.-Creating-XY-animations.mp4", + "07.-Aminations/02.-Easing-and-triggers.mp4", + "07.-Aminations/03.-Not-XY-animations.mp4", + "07.-Aminations/04.-Interpolation.mp4", + "07.-Aminations/05.-Sequence-and-timing-animations.mp4", + "08.-A-little-bit-of-Redux/01.-Connecting-Redux.mp4", + "08.-A-little-bit-of-Redux/02.-Dispatching-an-action.mp4", + "08.-A-little-bit-of-Redux/03.-Connecting-the-devtools.mp4", + "09.-Practice-project--NBA-app/01.-Project-overview.mp4", + "09.-Practice-project--NBA-app/02.-Installing-react-and-dependencies.mp4", + "09.-Practice-project--NBA-app/03.-Setting-up-Redux.mp4", + "09.-Practice-project--NBA-app/04.-Adding-React-navigation.mp4", + "09.-Practice-project--NBA-app/05.-Adding-React-navigation-..continued.mp4", + "09.-Practice-project--NBA-app/06.-Login-logo-and-background.mp4", + "09.-Practice-project--NBA-app/07.-Form-reusable-inputs.mp4", + "09.-Practice-project--NBA-app/08.-Finishing-inputs-and-error-state.mp4", + "09.-Practice-project--NBA-app/09.-Adding-the-buttons.mp4", + "09.-Practice-project--NBA-app/10.-Adding-validation.mp4", + "09.-Practice-project--NBA-app/11.-Finishing-validation.mp4", + "09.-Practice-project--NBA-app/12.-Submitting-the-form.mp4", + "09.-Practice-project--NBA-app/13.-Using-redux-before-server.mp4", + "09.-Practice-project--NBA-app/14.-Sign-up-the-user.mp4", + "09.-Practice-project--NBA-app/15.-Sign-in-user.mp4", + "09.-Practice-project--NBA-app/16.-Saving-the-token-on-the-storage.mp4", + "09.-Practice-project--NBA-app/17.-Adding-the-Auto-sign-in.mp4", + "09.-Practice-project--NBA-app/18.-Styling-the-header-tab.mp4", + "09.-Practice-project--NBA-app/19.-Icons-and-style-on-the-bottom-bar.mp4", + "09.-Practice-project--NBA-app/20.-Icons-and-style-on-the-bottom-bar---part-two.mp4", + "09.-Practice-project--NBA-app/21.-Preparing-the-news.mp4", + "09.-Practice-project--NBA-app/22.-Showing-News-cards.mp4", + "09.-Practice-project--NBA-app/23.-Finishing-the-News-cards.mp4", + "09.-Practice-project--NBA-app/24.-Installing-and-using-fonts.mp4", + "09.-Practice-project--NBA-app/25.-Creating-the-News-article.mp4", + "09.-Practice-project--NBA-app/26.-Getting-the-games-from-F.Base.mp4", + "09.-Practice-project--NBA-app/27.-Getting-the-games-from-F.Base---part-2.mp4", + "09.-Practice-project--NBA-app/28.-Finishing-the-games-main-screen.mp4", + "09.-Practice-project--NBA-app/29.-Creating-the-Games-Video-screen.mp4", + "09.-Practice-project--NBA-app/30.-Finishing-the-Games-video-screen.mp4", + "10.-React--[-optional-]---Basics/01.-Installing-Node-and-creating-an-App.mp4", + "10.-React--[-optional-]---Basics/02.-The-bundle.mp4", + "10.-React--[-optional-]---Basics/03.-Starting-to-code-!!.mp4", + "10.-React--[-optional-]---Basics/04.-JSX-Behind-the-scenes.mp4", + "10.-React--[-optional-]---Basics/05.-Importing-components.mp4", + "10.-React--[-optional-]---Basics/06.-Types-of-components.mp4", + "10.-React--[-optional-]---Basics/07.-Adding-styles.mp4", + "10.-React--[-optional-]---Basics/08.-Events.mp4", + "10.-React--[-optional-]---Basics/09.-State.mp4", + "10.-React--[-optional-]---Basics/10.-Starting-with-props.mp4", + "10.-React--[-optional-]---Basics/11.-Starting-with-props...continued.mp4", + "10.-React--[-optional-]---Basics/12.-Props-to-a-Class.mp4", + "10.-React--[-optional-]---Basics/13.-React-children.mp4", + "10.-React--[-optional-]---Basics/14.-More-with-styles.mp4", + "10.-React--[-optional-]---Basics/15.-Styles-plugins.mp4", + "10.-React--[-optional-]---Basics/16.-Filter-the-news.mp4", + "11.-React--[-optional-]---Routes/01.-Installing-Router.mp4", + "11.-React--[-optional-]---Routes/02.-How-it-works-and-creating-components.mp4", + "11.-React--[-optional-]---Routes/03.-Using-routes.mp4", + "11.-React--[-optional-]---Routes/04.-Linking.mp4", + "11.-React--[-optional-]---Routes/05.-Working-with-params.mp4", + "11.-React--[-optional-]---Routes/06.-Other-features-from-React-Router.mp4", + "11.-React--[-optional-]---Routes/07.-Switch.mp4", + "11.-React--[-optional-]---Routes/08.-Redirections.mp4", + "11.-React--[-optional-]---Routes/09.-404-and-withRouter.mp4", + "12.-React-intermediate-[-optional-]---Intermediate/01.-Component-lifecycles.mp4", + "12.-React-intermediate-[-optional-]---Intermediate/02.-Component-lifecycles-2.mp4", + "12.-React-intermediate-[-optional-]---Intermediate/03.-Conditional-rendering.mp4", + "12.-React-intermediate-[-optional-]---Intermediate/04.-Pure-components.mp4", + "12.-React-intermediate-[-optional-]---Intermediate/05.-Adjacent-elements.mp4", + "12.-React-intermediate-[-optional-]---Intermediate/06.-Hoc's-(-High-order-components-).mp4", + "12.-React-intermediate-[-optional-]---Intermediate/07.-Hoc's-...continued.mp4", + "13.-React-[-optional-]---Transitions/01.-Using-transitions.mp4", + "13.-React-[-optional-]---Transitions/02.-Using-transitions....continued.mp4", + "13.-React-[-optional-]---Transitions/03.-CSS-Transitions.mp4", + "13.-React-[-optional-]---Transitions/04.-Transition-group.mp4", + "14.-React-[-optional-]---More-on-react/01.-Proptypes.mp4", + "14.-React-[-optional-]---More-on-react/02.-Proptypes...continued.mp4", + "14.-React-[-optional-]---More-on-react/03.-Controlled-components.mp4", + "15.-React-[-optional-]---Redux/01.-Redux-introduction.mp4", + "15.-React-[-optional-]---Redux/02.-Creating-the-store.mp4", + "15.-React-[-optional-]---Redux/03.-The-Redux-flow.mp4", + "15.-React-[-optional-]---Redux/04.-Combining-reducers.mp4", + "15.-React-[-optional-]---Redux/05.-Creating-a-valid-reducer.mp4", + "15.-React-[-optional-]---Redux/06.-Creating-actions.mp4", + "15.-React-[-optional-]---Redux/07.-map-state-to-props-and-connect.mp4", + "15.-React-[-optional-]---Redux/08.-Map-dispatch-to-props.mp4", + "15.-React-[-optional-]---Redux/09.-Types.mp4", + "15.-React-[-optional-]---Redux/10.-Using-middleware.mp4", + "15.-React-[-optional-]---Redux/11.-Redux-practice---Creating-the-project.mp4", + "15.-React-[-optional-]---Redux/12.-Redux-practice---routes-and-redux.mp4", + "15.-React-[-optional-]---Redux/13.-Redux-practice---Home.mp4", + "15.-React-[-optional-]---Redux/14.-Redux-practice---Filter-the-home-list.mp4", + "15.-React-[-optional-]---Redux/15.-Redux-practice---Artist-section.mp4", + "15.-React-[-optional-]---Redux/16.-Redux-practice---Clearing-artist-data.mp4", + "16.-React-[-optional-]---Hooks/01.-Introduction-to-Hooks.mp4", + "16.-React-[-optional-]---Hooks/02.-The-useState-Hook.mp4", + "16.-React-[-optional-]---Hooks/03.-The-useState-Hook-....continued.mp4", + "16.-React-[-optional-]---Hooks/04.-The-useEffect-Hook.mp4", + "16.-React-[-optional-]---Hooks/05.-The-useReducer-Hook.mp4", + "16.-React-[-optional-]---Hooks/06.-Preparing-the-app-with-Context.mp4", + "16.-React-[-optional-]---Hooks/07.-Context-and-useContext.mp4", + "17.-Introduction-(-LEGACY-)/01.-Project-overview.mp4", + "17.-Introduction-(-LEGACY-)/02.-Installing-Node-JS.mp4", + "17.-Introduction-(-LEGACY-)/03.-IDE.mp4", + "17.-Introduction-(-LEGACY-)/04.-Installing-the-CLI----MAC-users.mp4", + "17.-Introduction-(-LEGACY-)/05.-installing-the-CLI---WINDOWS-users.mp4", + "17.-Introduction-(-LEGACY-)/06.-Using-EXPO.mp4", + "17.-Introduction-(-LEGACY-)/07.-Ejecting-the-App.mp4", + "17.-Introduction-(-LEGACY-)/08.-Running-the-ANDROID-simulator----WINDOWS-and-MAC-users.mp4", + "17.-Introduction-(-LEGACY-)/09.-Environment-variables---WINDOWS-users-only.mp4", + "17.-Introduction-(-LEGACY-)/10.-IOS-simulator---MAC-users-only.mp4", + "18.-The-basics-(-LEGACY-)/01.-Starting-with-react-native.mp4", + "18.-The-basics-(-LEGACY-)/02.-Styles-and-views.mp4", + "18.-The-basics-(-LEGACY-)/03.-Custom-components-and-state.mp4", + "18.-The-basics-(-LEGACY-)/04.-Touch-events.mp4", + "18.-The-basics-(-LEGACY-)/05.-Touch-events-continued....mp4", + "18.-The-basics-(-LEGACY-)/06.-Text-Inputs.mp4", + "18.-The-basics-(-LEGACY-)/07.-Using-buttons.mp4", + "18.-The-basics-(-LEGACY-)/08.-Scrollview.mp4", + "18.-The-basics-(-LEGACY-)/09.-Picker-and-slider.mp4", + "18.-The-basics-(-LEGACY-)/10.-Activity-indicator.mp4", + "18.-The-basics-(-LEGACY-)/11.-Adding-images.mp4", + "18.-The-basics-(-LEGACY-)/12.-Modals.mp4", + "19.-Routing-(-LEGACY-)/01.-Introduction.mp4", + "19.-Routing-(-LEGACY-)/02.-Default-React-Navigation.mp4", + "19.-Routing-(-LEGACY-)/03.-RNN---(3rd-lib)---install.mp4", + "19.-Routing-(-LEGACY-)/04.-RNN---Single-screen-app.mp4", + "19.-Routing-(-LEGACY-)/05.-RNN--Tab-base-app.mp4", + "19.-Routing-(-LEGACY-)/06.-RNN---Sidedrawer.mp4", + "19.-Routing-(-LEGACY-)/07.-RNN---Navigator-style.mp4", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/01.-Working-with-the-camera-and-library.mp4", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/02.-Using-Image-picker.mp4", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/03.-React-native-contacts.mp4", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/04.-Using-contacts.mp4", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/05.-RN-vector-icons.mp4", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/06.-Using-RN-vector-icons.mp4", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/07.-Icons-imagesources.mp4", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/08.-Debugging.mp4", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/10.-More-on-styles-and-reusable-components.mp4", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/11.-The-patform.mp4", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/12.-Dimensions.mp4", + "21.-Animations-(-LEGACY-)/01.-Creating-animations-with-RN.mp4", + "21.-Animations-(-LEGACY-)/02.-Creating-animations-with-RN.mp4", + "21.-Animations-(-LEGACY-)/03.-interpolation.mp4", + "21.-Animations-(-LEGACY-)/04.-Text-animations.mp4", + "21.-Animations-(-LEGACY-)/05.-Parallel-and-sequence-animations.mp4", + "22.-Redux-&-Firebase-(-LEGACY-)/01.-Redux-intro.mp4", + "22.-Redux-&-Firebase-(-LEGACY-)/02.-Setting-up-redux.mp4", + "22.-Redux-&-Firebase-(-LEGACY-)/03.-Dispatching-actions.mp4", + "22.-Redux-&-Firebase-(-LEGACY-)/04.-Firebase.mp4", + "22.-Redux-&-Firebase-(-LEGACY-)/05.-Storing-data.mp4", + "22.-Redux-&-Firebase-(-LEGACY-)/06.-Storing-in-redux.mp4", + "22.-Redux-&-Firebase-(-LEGACY-)/07.-Fetching-data.mp4", + "22.-Redux-&-Firebase-(-LEGACY-)/08.-Update-and-delete.mp4", + "22.-Redux-&-Firebase-(-LEGACY-)/09.-Registering-users.mp4", + "22.-Redux-&-Firebase-(-LEGACY-)/10.-Login-Users.mp4", + "22.-Redux-&-Firebase-(-LEGACY-)/11.-Refreshing-tokens.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/01.-Intro.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/02.-Creating-the-project.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/03.-React-native-navigation,-setting-up.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/04.-Using-navigation.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/05.-Adding-Tabs.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/06.-Adding-Redux.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/07.-Animating-the-Logo.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/08.-Animating-the-Logo-continued-....mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/09.-Animating-the-form.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/10.-Creating-the-Login-form.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/11.-Creating-the-Login-form...continued.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/12.-Adding-buttons-to-the-Login.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/13.-Adding-validation.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/14.-Adding-validation-2.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/15.-Getting-the-formData.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/16.-Using-Firebase-Authentication.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/17.-Registering-and-Sign-In.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/18.-Storing-the-tokens.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/19.-Creating-an-auto-Sign-In.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/20.-Creating-an-auto-Sign-In..continued.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/21.-Installing-RN--icons.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/22.-Tabs-and-Side-Drawer.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/23.-Tabs-and-Side-Drawer..continued.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/24.-Side-Drawer-options.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/25.-Finishing-Side-Drawer.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/26.-Home-horizontal-scroll.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/27.-Finishing-horizontal-scroll.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/28.-Fetching-articles-from-HOME.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/29.-Fetching-articles-from-HOME-2.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/30.-Fetching-articles-from-HOME-3.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/31.-Finishing-HOME.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/32.-Creating-the-article-views.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/33.-Finishing-article-views.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/34.-Not-allowed-view.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/35.-Add-POST-view,-adding-form-elements.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/36.-Add-POST-view,-adding-form-elements-2.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/37.-Add-POST-view,-adding-form-elements-3.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/38.-Add-POST-view,-using-modals.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/39.-Add-POST-view,-posting-article.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/40.-Add-POST-view,-posting-article-..continued.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/41.-User-POSTS,-getting-user-posts.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/42.-User-POSTS,-getting-user-posts..continued.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/43.-User-POSTS,--deleting-posts.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/44.-User-POSTS,-deleting-posts-2.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/45.-User-POSTS,-deleting-posts-3.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/46.-Launcher-icons---ANDROID.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/47.-Launcher-icons---IOS.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/48.-Splash-screen---ANDROID.mp4", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/49.-Splash-screen---IOS.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/01.-Boilerplate.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/02.-Bundle-and-structure.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/03.-Rendering.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/04.-JSX.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/05.-Structure-and-exporting.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/06.-Dynamic-Data.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/07.-Functional-and-class-based-components.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/08.-Adding-some-style.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/09.-Events.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/10.-A-little-bit-more-of-classes.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/11.-React-state.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/12.-Using-props.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/13.-Using-props-2.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/14.-Using-props-3.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/15.-Children-props.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/16.-More-on-styles.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/17.-Using-CSS-modules.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/18.-Filtering-state.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/19.-Routes--installing-it.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/20.-Routes-Adding-routes.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/21.-Routes-Linking.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/22.-Routes-Params-and-URL's.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/23.-Routes-Switch.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/24.-Routes-Redirections.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/25.-React-Lifecycles.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/26.-React-Lifecycles-..continued.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/27.-Conditional-rendering.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/28.-Pure-components.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/29.-Returning-arrays.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/30.-HOC's.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/31.-HOC's-...continued.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/33.-React-transitions.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/34.-React-transitions-2.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/35.-CSS-transitions.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/36.-Transition-group.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/37.-Proptypes.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/38.-Proptypes-2.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/39.-Refs.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/40.-Controlled-and-uncontrolled.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/41.-Form-template.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/42.-Form-template-2.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/43.-Form-template-3.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/44.-Adding-textarea-and-select.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/45.-Validation.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/46.-Validation-2.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/47.-REDUX-Installing-and-connecting.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/48.-REDUX-Reducers.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/49.-REDUX-Action-creators.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/50.-REDUX-Dispatch.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/51.-REDUX-Containers.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/52.-REDUX-PRACTICE-Intro-and-setup.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/53.-REDUX-PRACTICE-Adding-redux-to-home.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/54.-REDUX-PRACTICE-Finishing-home-and-adding-the-artist-view.mp4", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/55.-REDUX-PRACTICE-Fixing-issues.mp4" +]; \ No newline at end of file diff --git a/player/list_vtt.js b/player/list_vtt.js new file mode 100644 index 0000000..830f461 --- /dev/null +++ b/player/list_vtt.js @@ -0,0 +1,310 @@ +var vtt_files = [ + "01.-Intro/01.-Introduction.vtt", + "01.-Intro/02.-What-is-React-Native-.vtt", + "01.-Intro/03.-Starting-with-RN.vtt", + "01.-Intro/04.-Installing-tools-(-MAC-USERS-).vtt", + "01.-Intro/05.-Installing-tools-(-WINDOWS-USERS-).vtt", + "01.-Intro/06.-Installing-ANDROID-STUDIO-(-Mac-and-Win-users-).vtt", + "02.-Running-apps-on-simulators/01.-Running-on-Expo.vtt", + "02.-Running-apps-on-simulators/02.-Ejecting-expo-apps.vtt", + "02.-Running-apps-on-simulators/03.-Running-Android-simulator-(-WIN-and-MAC-users-).vtt", + "02.-Running-apps-on-simulators/04.-Windows-environment-variables-(-WIN-users-).vtt", + "02.-Running-apps-on-simulators/05.-Running-IOS-simulator-(-MAC-users-).vtt", + "03.-Starting-with-react-native/01.-First-look-at-the-structure.vtt", + "03.-Starting-with-react-native/02.-Styles,-Views-and-Text.vtt", + "03.-Starting-with-react-native/03.-Components-and-State.vtt", + "03.-Starting-with-react-native/04.-Buttons-and-touch-events.vtt", + "03.-Starting-with-react-native/05.-More-on-touchables.vtt", + "03.-Starting-with-react-native/06.-Handling-inputs.vtt", + "03.-Starting-with-react-native/07.-Adding-users-to-the-list.vtt", + "03.-Starting-with-react-native/08.-Using-the-Scrollview.vtt", + "03.-Starting-with-react-native/09.-The-picker-component.vtt", + "03.-Starting-with-react-native/10.-The-Slider-component-(-0.58.6-).vtt", + "03.-Starting-with-react-native/11.-Activity-indicator.vtt", + "03.-Starting-with-react-native/12.-Working-with-images.vtt", + "03.-Starting-with-react-native/13.-Using-Modals.vtt", + "04.-React-Navigation/01.-Intro-to-react-navigation.vtt", + "04.-React-Navigation/02.-Installing-R.Navigation-and-running-Sim.vtt", + "04.-React-Navigation/03.-Stack-navigator-and-linking-screens.vtt", + "04.-React-Navigation/04.-Navigation-params.vtt", + "04.-React-Navigation/05.-Customizing-the-Header-Bar.vtt", + "04.-React-Navigation/06.-Adding-logos-to-headers.vtt", + "04.-React-Navigation/07.-Creating-a-Side-drawer.vtt", + "04.-React-Navigation/08.-More-on-Side-drawer.vtt", + "04.-React-Navigation/09.-Custom-component-for-Side-drawer.vtt", + "04.-React-Navigation/10.-Creating-a-bottom-Navigation.vtt", + "04.-React-Navigation/11.-Tab-Navigation-Options.vtt", + "04.-React-Navigation/12.-Combining-navigation-types..vtt", + "05.-Using-phone-resources/01.-Installing-Image-picker-(-link-).vtt", + "05.-Using-phone-resources/02.-If-image-picker-fails,-manual-install.vtt", + "05.-Using-phone-resources/03.-Using-camera-and-photo-library.vtt", + "05.-Using-phone-resources/04.-Installing-RNative-contacts.vtt", + "05.-Using-phone-resources/05.-Getting-contacts.vtt", + "05.-Using-phone-resources/06.-Adding-contact-and-opening-form.vtt", + "05.-Using-phone-resources/07.-installing-RNative-vector-icons.vtt", + "05.-Using-phone-resources/08.-Using-RNative-vector-icons.vtt", + "06.-Other-RN-aspects/01.-React-native-debugger.vtt", + "06.-Other-RN-aspects/02.-Reusing-components-and-styles.vtt", + "06.-Other-RN-aspects/03.-More-on-the-platform.vtt", + "06.-Other-RN-aspects/04.-Dimensions.vtt", + "06.-Other-RN-aspects/05.-Device-info-3rd-party-library.vtt", + "07.-Aminations/01.-Creating-XY-animations.vtt", + "07.-Aminations/02.-Easing-and-triggers.vtt", + "07.-Aminations/03.-Not-XY-animations.vtt", + "07.-Aminations/04.-Interpolation.vtt", + "07.-Aminations/05.-Sequence-and-timing-animations.vtt", + "08.-A-little-bit-of-Redux/01.-Connecting-Redux.vtt", + "08.-A-little-bit-of-Redux/02.-Dispatching-an-action.vtt", + "08.-A-little-bit-of-Redux/03.-Connecting-the-devtools.vtt", + "09.-Practice-project--NBA-app/01.-Project-overview.vtt", + "09.-Practice-project--NBA-app/02.-Installing-react-and-dependencies.vtt", + "09.-Practice-project--NBA-app/03.-Setting-up-Redux.vtt", + "09.-Practice-project--NBA-app/04.-Adding-React-navigation.vtt", + "09.-Practice-project--NBA-app/05.-Adding-React-navigation-..continued.vtt", + "09.-Practice-project--NBA-app/06.-Login-logo-and-background.vtt", + "09.-Practice-project--NBA-app/07.-Form-reusable-inputs.vtt", + "09.-Practice-project--NBA-app/08.-Finishing-inputs-and-error-state.vtt", + "09.-Practice-project--NBA-app/09.-Adding-the-buttons.vtt", + "09.-Practice-project--NBA-app/10.-Adding-validation.vtt", + "09.-Practice-project--NBA-app/11.-Finishing-validation.vtt", + "09.-Practice-project--NBA-app/12.-Submitting-the-form.vtt", + "09.-Practice-project--NBA-app/13.-Using-redux-before-server.vtt", + "09.-Practice-project--NBA-app/14.-Sign-up-the-user.vtt", + "09.-Practice-project--NBA-app/15.-Sign-in-user.vtt", + "09.-Practice-project--NBA-app/16.-Saving-the-token-on-the-storage.vtt", + "09.-Practice-project--NBA-app/17.-Adding-the-Auto-sign-in.vtt", + "09.-Practice-project--NBA-app/18.-Styling-the-header-tab.vtt", + "09.-Practice-project--NBA-app/19.-Icons-and-style-on-the-bottom-bar.vtt", + "09.-Practice-project--NBA-app/20.-Icons-and-style-on-the-bottom-bar---part-two.vtt", + "09.-Practice-project--NBA-app/21.-Preparing-the-news.vtt", + "09.-Practice-project--NBA-app/22.-Showing-News-cards.vtt", + "09.-Practice-project--NBA-app/23.-Finishing-the-News-cards.vtt", + "09.-Practice-project--NBA-app/24.-Installing-and-using-fonts.vtt", + "09.-Practice-project--NBA-app/25.-Creating-the-News-article.vtt", + "09.-Practice-project--NBA-app/26.-Getting-the-games-from-F.Base.vtt", + "09.-Practice-project--NBA-app/27.-Getting-the-games-from-F.Base---part-2.vtt", + "09.-Practice-project--NBA-app/28.-Finishing-the-games-main-screen.vtt", + "09.-Practice-project--NBA-app/29.-Creating-the-Games-Video-screen.vtt", + "09.-Practice-project--NBA-app/30.-Finishing-the-Games-video-screen.vtt", + "10.-React--[-optional-]---Basics/01.-Installing-Node-and-creating-an-App.vtt", + "10.-React--[-optional-]---Basics/02.-The-bundle.vtt", + "10.-React--[-optional-]---Basics/03.-Starting-to-code-!!.vtt", + "10.-React--[-optional-]---Basics/04.-JSX-Behind-the-scenes.vtt", + "10.-React--[-optional-]---Basics/05.-Importing-components.vtt", + "10.-React--[-optional-]---Basics/06.-Types-of-components.vtt", + "10.-React--[-optional-]---Basics/07.-Adding-styles.vtt", + "10.-React--[-optional-]---Basics/08.-Events.vtt", + "10.-React--[-optional-]---Basics/09.-State.vtt", + "10.-React--[-optional-]---Basics/10.-Starting-with-props.vtt", + "10.-React--[-optional-]---Basics/11.-Starting-with-props...continued.vtt", + "10.-React--[-optional-]---Basics/12.-Props-to-a-Class.vtt", + "10.-React--[-optional-]---Basics/13.-React-children.vtt", + "10.-React--[-optional-]---Basics/14.-More-with-styles.vtt", + "10.-React--[-optional-]---Basics/15.-Styles-plugins.vtt", + "10.-React--[-optional-]---Basics/16.-Filter-the-news.vtt", + "11.-React--[-optional-]---Routes/01.-Installing-Router.vtt", + "11.-React--[-optional-]---Routes/02.-How-it-works-and-creating-components.vtt", + "11.-React--[-optional-]---Routes/03.-Using-routes.vtt", + "11.-React--[-optional-]---Routes/04.-Linking.vtt", + "11.-React--[-optional-]---Routes/05.-Working-with-params.vtt", + "11.-React--[-optional-]---Routes/06.-Other-features-from-React-Router.vtt", + "11.-React--[-optional-]---Routes/07.-Switch.vtt", + "11.-React--[-optional-]---Routes/08.-Redirections.vtt", + "11.-React--[-optional-]---Routes/09.-404-and-withRouter.vtt", + "12.-React-intermediate-[-optional-]---Intermediate/01.-Component-lifecycles.vtt", + "12.-React-intermediate-[-optional-]---Intermediate/02.-Component-lifecycles-2.vtt", + "12.-React-intermediate-[-optional-]---Intermediate/03.-Conditional-rendering.vtt", + "12.-React-intermediate-[-optional-]---Intermediate/04.-Pure-components.vtt", + "12.-React-intermediate-[-optional-]---Intermediate/05.-Adjacent-elements.vtt", + "12.-React-intermediate-[-optional-]---Intermediate/06.-Hoc's-(-High-order-components-).vtt", + "12.-React-intermediate-[-optional-]---Intermediate/07.-Hoc's-...continued.vtt", + "13.-React-[-optional-]---Transitions/01.-Using-transitions.vtt", + "13.-React-[-optional-]---Transitions/02.-Using-transitions....continued.vtt", + "13.-React-[-optional-]---Transitions/03.-CSS-Transitions.vtt", + "13.-React-[-optional-]---Transitions/04.-Transition-group.vtt", + "14.-React-[-optional-]---More-on-react/01.-Proptypes.vtt", + "14.-React-[-optional-]---More-on-react/02.-Proptypes...continued.vtt", + "14.-React-[-optional-]---More-on-react/03.-Controlled-components.vtt", + "15.-React-[-optional-]---Redux/01.-Redux-introduction.vtt", + "15.-React-[-optional-]---Redux/02.-Creating-the-store.vtt", + "15.-React-[-optional-]---Redux/03.-The-Redux-flow.vtt", + "15.-React-[-optional-]---Redux/04.-Combining-reducers.vtt", + "15.-React-[-optional-]---Redux/05.-Creating-a-valid-reducer.vtt", + "15.-React-[-optional-]---Redux/06.-Creating-actions.vtt", + "15.-React-[-optional-]---Redux/07.-map-state-to-props-and-connect.vtt", + "15.-React-[-optional-]---Redux/08.-Map-dispatch-to-props.vtt", + "15.-React-[-optional-]---Redux/09.-Types.vtt", + "15.-React-[-optional-]---Redux/10.-Using-middleware.vtt", + "15.-React-[-optional-]---Redux/11.-Redux-practice---Creating-the-project.vtt", + "15.-React-[-optional-]---Redux/12.-Redux-practice---routes-and-redux.vtt", + "15.-React-[-optional-]---Redux/13.-Redux-practice---Home.vtt", + "15.-React-[-optional-]---Redux/14.-Redux-practice---Filter-the-home-list.vtt", + "15.-React-[-optional-]---Redux/15.-Redux-practice---Artist-section.vtt", + "15.-React-[-optional-]---Redux/16.-Redux-practice---Clearing-artist-data.vtt", + "16.-React-[-optional-]---Hooks/01.-Introduction-to-Hooks.vtt", + "16.-React-[-optional-]---Hooks/02.-The-useState-Hook.vtt", + "16.-React-[-optional-]---Hooks/03.-The-useState-Hook-....continued.vtt", + "16.-React-[-optional-]---Hooks/04.-The-useEffect-Hook.vtt", + "16.-React-[-optional-]---Hooks/05.-The-useReducer-Hook.vtt", + "16.-React-[-optional-]---Hooks/06.-Preparing-the-app-with-Context.vtt", + "16.-React-[-optional-]---Hooks/07.-Context-and-useContext.vtt", + "17.-Introduction-(-LEGACY-)/01.-Project-overview.vtt", + "17.-Introduction-(-LEGACY-)/02.-Installing-Node-JS.vtt", + "17.-Introduction-(-LEGACY-)/03.-IDE.vtt", + "17.-Introduction-(-LEGACY-)/04.-Installing-the-CLI----MAC-users.vtt", + "17.-Introduction-(-LEGACY-)/05.-installing-the-CLI---WINDOWS-users.vtt", + "17.-Introduction-(-LEGACY-)/06.-Using-EXPO.vtt", + "17.-Introduction-(-LEGACY-)/07.-Ejecting-the-App.vtt", + "17.-Introduction-(-LEGACY-)/08.-Running-the-ANDROID-simulator----WINDOWS-and-MAC-users.vtt", + "17.-Introduction-(-LEGACY-)/09.-Environment-variables---WINDOWS-users-only.vtt", + "17.-Introduction-(-LEGACY-)/10.-IOS-simulator---MAC-users-only.vtt", + "18.-The-basics-(-LEGACY-)/01.-Starting-with-react-native.vtt", + "18.-The-basics-(-LEGACY-)/02.-Styles-and-views.vtt", + "18.-The-basics-(-LEGACY-)/03.-Custom-components-and-state.vtt", + "18.-The-basics-(-LEGACY-)/04.-Touch-events.vtt", + "18.-The-basics-(-LEGACY-)/05.-Touch-events-continued....vtt", + "18.-The-basics-(-LEGACY-)/06.-Text-Inputs.vtt", + "18.-The-basics-(-LEGACY-)/07.-Using-buttons.vtt", + "18.-The-basics-(-LEGACY-)/08.-Scrollview.vtt", + "18.-The-basics-(-LEGACY-)/09.-Picker-and-slider.vtt", + "18.-The-basics-(-LEGACY-)/10.-Activity-indicator.vtt", + "18.-The-basics-(-LEGACY-)/11.-Adding-images.vtt", + "18.-The-basics-(-LEGACY-)/12.-Modals.vtt", + "19.-Routing-(-LEGACY-)/01.-Introduction.vtt", + "19.-Routing-(-LEGACY-)/02.-Default-React-Navigation.vtt", + "19.-Routing-(-LEGACY-)/03.-RNN---(3rd-lib)---install.vtt", + "19.-Routing-(-LEGACY-)/04.-RNN---Single-screen-app.vtt", + "19.-Routing-(-LEGACY-)/05.-RNN--Tab-base-app.vtt", + "19.-Routing-(-LEGACY-)/06.-RNN---Sidedrawer.vtt", + "19.-Routing-(-LEGACY-)/07.-RNN---Navigator-style.vtt", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/01.-Working-with-the-camera-and-library.vtt", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/02.-Using-Image-picker.vtt", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/03.-React-native-contacts.vtt", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/04.-Using-contacts.vtt", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/05.-RN-vector-icons.vtt", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/06.-Using-RN-vector-icons.vtt", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/07.-Icons-imagesources.vtt", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/08.-Debugging.vtt", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/10.-More-on-styles-and-reusable-components.vtt", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/11.-The-patform.vtt", + "20.-Deep-dive-into-React-Native-(-LEGACY-)/12.-Dimensions.vtt", + "21.-Animations-(-LEGACY-)/01.-Creating-animations-with-RN.vtt", + "21.-Animations-(-LEGACY-)/02.-Creating-animations-with-RN.vtt", + "21.-Animations-(-LEGACY-)/03.-interpolation.vtt", + "21.-Animations-(-LEGACY-)/04.-Text-animations.vtt", + "21.-Animations-(-LEGACY-)/05.-Parallel-and-sequence-animations.vtt", + "22.-Redux-&-Firebase-(-LEGACY-)/01.-Redux-intro.vtt", + "22.-Redux-&-Firebase-(-LEGACY-)/02.-Setting-up-redux.vtt", + "22.-Redux-&-Firebase-(-LEGACY-)/03.-Dispatching-actions.vtt", + "22.-Redux-&-Firebase-(-LEGACY-)/04.-Firebase.vtt", + "22.-Redux-&-Firebase-(-LEGACY-)/05.-Storing-data.vtt", + "22.-Redux-&-Firebase-(-LEGACY-)/06.-Storing-in-redux.vtt", + "22.-Redux-&-Firebase-(-LEGACY-)/07.-Fetching-data.vtt", + "22.-Redux-&-Firebase-(-LEGACY-)/08.-Update-and-delete.vtt", + "22.-Redux-&-Firebase-(-LEGACY-)/09.-Registering-users.vtt", + "22.-Redux-&-Firebase-(-LEGACY-)/10.-Login-Users.vtt", + "22.-Redux-&-Firebase-(-LEGACY-)/11.-Refreshing-tokens.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/01.-Intro.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/02.-Creating-the-project.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/03.-React-native-navigation,-setting-up.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/04.-Using-navigation.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/05.-Adding-Tabs.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/06.-Adding-Redux.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/07.-Animating-the-Logo.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/08.-Animating-the-Logo-continued-....vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/09.-Animating-the-form.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/10.-Creating-the-Login-form.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/11.-Creating-the-Login-form...continued.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/12.-Adding-buttons-to-the-Login.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/13.-Adding-validation.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/14.-Adding-validation-2.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/15.-Getting-the-formData.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/16.-Using-Firebase-Authentication.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/17.-Registering-and-Sign-In.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/18.-Storing-the-tokens.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/19.-Creating-an-auto-Sign-In.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/20.-Creating-an-auto-Sign-In..continued.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/21.-Installing-RN--icons.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/22.-Tabs-and-Side-Drawer.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/23.-Tabs-and-Side-Drawer..continued.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/24.-Side-Drawer-options.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/25.-Finishing-Side-Drawer.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/26.-Home-horizontal-scroll.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/27.-Finishing-horizontal-scroll.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/28.-Fetching-articles-from-HOME.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/29.-Fetching-articles-from-HOME-2.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/30.-Fetching-articles-from-HOME-3.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/31.-Finishing-HOME.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/32.-Creating-the-article-views.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/33.-Finishing-article-views.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/34.-Not-allowed-view.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/35.-Add-POST-view,-adding-form-elements.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/36.-Add-POST-view,-adding-form-elements-2.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/37.-Add-POST-view,-adding-form-elements-3.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/38.-Add-POST-view,-using-modals.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/39.-Add-POST-view,-posting-article.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/40.-Add-POST-view,-posting-article-..continued.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/41.-User-POSTS,-getting-user-posts.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/42.-User-POSTS,-getting-user-posts..continued.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/43.-User-POSTS,--deleting-posts.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/44.-User-POSTS,-deleting-posts-2.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/45.-User-POSTS,-deleting-posts-3.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/46.-Launcher-icons---ANDROID.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/47.-Launcher-icons---IOS.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/48.-Splash-screen---ANDROID.vtt", + "23.-Sell-it-App----Practice-Project-(-LEGACY-)/49.-Splash-screen---IOS.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/01.-Boilerplate.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/02.-Bundle-and-structure.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/03.-Rendering.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/04.-JSX.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/05.-Structure-and-exporting.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/06.-Dynamic-Data.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/07.-Functional-and-class-based-components.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/08.-Adding-some-style.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/09.-Events.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/10.-A-little-bit-more-of-classes.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/11.-React-state.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/12.-Using-props.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/13.-Using-props-2.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/14.-Using-props-3.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/15.-Children-props.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/16.-More-on-styles.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/17.-Using-CSS-modules.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/18.-Filtering-state.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/19.-Routes--installing-it.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/20.-Routes-Adding-routes.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/21.-Routes-Linking.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/22.-Routes-Params-and-URL's.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/23.-Routes-Switch.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/24.-Routes-Redirections.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/25.-React-Lifecycles.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/26.-React-Lifecycles-..continued.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/27.-Conditional-rendering.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/28.-Pure-components.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/29.-Returning-arrays.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/30.-HOC's.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/31.-HOC's-...continued.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/33.-React-transitions.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/34.-React-transitions-2.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/35.-CSS-transitions.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/36.-Transition-group.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/37.-Proptypes.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/38.-Proptypes-2.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/39.-Refs.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/40.-Controlled-and-uncontrolled.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/41.-Form-template.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/42.-Form-template-2.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/43.-Form-template-3.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/44.-Adding-textarea-and-select.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/45.-Validation.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/46.-Validation-2.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/47.-REDUX-Installing-and-connecting.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/48.-REDUX-Reducers.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/49.-REDUX-Action-creators.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/50.-REDUX-Dispatch.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/51.-REDUX-Containers.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/52.-REDUX-PRACTICE-Intro-and-setup.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/53.-REDUX-PRACTICE-Adding-redux-to-home.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/54.-REDUX-PRACTICE-Finishing-home-and-adding-the-artist-view.vtt", + "24.-BONUS-React-for-WEB-mini-course-(-LEGACY-)/55.-REDUX-PRACTICE-Fixing-issues.vtt", +]; \ No newline at end of file diff --git a/renderer-process/communication/async-msg.js b/renderer-process/communication/async-msg.js new file mode 100644 index 0000000..86c56de --- /dev/null +++ b/renderer-process/communication/async-msg.js @@ -0,0 +1,12 @@ +const {ipcRenderer} = require('electron') + +const asyncMsgBtn = document.getElementById('async-msg') + +asyncMsgBtn.addEventListener('click', () => { + ipcRenderer.send('asynchronous-message', 'ping') +}) + +ipcRenderer.on('asynchronous-reply', (event, arg) => { + const message = `Asynchronous message reply: ${arg}` + document.getElementById('async-reply').innerHTML = message +}) diff --git a/renderer-process/communication/invisible-msg.js b/renderer-process/communication/invisible-msg.js new file mode 100644 index 0000000..583a16f --- /dev/null +++ b/renderer-process/communication/invisible-msg.js @@ -0,0 +1,30 @@ +const {BrowserWindow} = require('electron').remote +const ipcRenderer = require('electron').ipcRenderer +const path = require('path') + +const invisMsgBtn = document.getElementById('invis-msg') +const invisReply = document.getElementById('invis-reply') + +invisMsgBtn.addEventListener('click', (clickEvent) => { + const windowID = BrowserWindow.getFocusedWindow().id + const invisPath = `file://${path.join(__dirname, '../../sections/communication/invisible.html')}` + let win = new BrowserWindow({ + width: 400, + height: 400, + show: false, + webPreferences: { + nodeIntegration: true + } + }) + win.loadURL(invisPath) + + win.webContents.on('did-finish-load', () => { + const input = 100 + win.webContents.send('compute-factorial', input, windowID) + }) +}) + +ipcRenderer.on('factorial-computed', (event, input, output) => { + const message = `The factorial of ${input} is ${output}` + invisReply.textContent = message +}) diff --git a/renderer-process/communication/sync-msg.js b/renderer-process/communication/sync-msg.js new file mode 100644 index 0000000..137784c --- /dev/null +++ b/renderer-process/communication/sync-msg.js @@ -0,0 +1,9 @@ +const {ipcRenderer} = require('electron') + +const syncMsgBtn = document.getElementById('sync-msg') + +syncMsgBtn.addEventListener('click', () => { + const reply = ipcRenderer.sendSync('synchronous-message', 'ping') + const message = `Synchronous message reply: ${reply}` + document.getElementById('sync-reply').innerHTML = message +}) diff --git a/renderer-process/media/desktop-capturer.js b/renderer-process/media/desktop-capturer.js new file mode 100644 index 0000000..4b5faff --- /dev/null +++ b/renderer-process/media/desktop-capturer.js @@ -0,0 +1,41 @@ +const {desktopCapturer, screen, shell} = require('electron') + +const fs = require('fs') +const os = require('os') +const path = require('path') + +const screenshot = document.getElementById('screen-shot') +const screenshotMsg = document.getElementById('screenshot-path') + +screenshot.addEventListener('click', (event) => { + screenshotMsg.textContent = 'Gathering screens...' + const thumbSize = determineScreenShotSize() + let options = { types: ['screen'], thumbnailSize: thumbSize } + + desktopCapturer.getSources(options, (error, sources) => { + if (error) return console.log(error) + + sources.forEach((source) => { + if (source.name === 'Entire screen' || source.name === 'Screen 1') { + const screenshotPath = path.join(os.tmpdir(), 'screenshot.png') + + fs.writeFile(screenshotPath, source.thumbnail.toPNG(), (error) => { + if (error) return console.log(error) + shell.openExternal(`file://${screenshotPath}`) + + const message = `Saved screenshot to: ${screenshotPath}` + screenshotMsg.textContent = message + }) + } + }) + }) +}) + +function determineScreenShotSize () { + const screenSize = screen.getPrimaryDisplay().workAreaSize + const maxDimension = Math.max(screenSize.width, screenSize.height) + return { + width: maxDimension * window.devicePixelRatio, + height: maxDimension * window.devicePixelRatio + } +} diff --git a/renderer-process/menus/context-menu.js b/renderer-process/menus/context-menu.js new file mode 100644 index 0000000..66a22f3 --- /dev/null +++ b/renderer-process/menus/context-menu.js @@ -0,0 +1,8 @@ +const {ipcRenderer} = require('electron') + +// Tell main process to show the menu when demo button is clicked +const contextMenuBtn = document.getElementById('context-menu') + +contextMenuBtn.addEventListener('click', () => { + ipcRenderer.send('show-context-menu') +}) diff --git a/renderer-process/native-ui/dialogs/error.js b/renderer-process/native-ui/dialogs/error.js new file mode 100644 index 0000000..7af45af --- /dev/null +++ b/renderer-process/native-ui/dialogs/error.js @@ -0,0 +1,7 @@ +const {ipcRenderer} = require('electron') + +const errorBtn = document.getElementById('error-dialog') + +errorBtn.addEventListener('click', (event) => { + ipcRenderer.send('open-error-dialog') +}) diff --git a/renderer-process/native-ui/dialogs/information.js b/renderer-process/native-ui/dialogs/information.js new file mode 100644 index 0000000..270f71c --- /dev/null +++ b/renderer-process/native-ui/dialogs/information.js @@ -0,0 +1,14 @@ +const {ipcRenderer} = require('electron') + +const informationBtn = document.getElementById('information-dialog') + +informationBtn.addEventListener('click', (event) => { + ipcRenderer.send('open-information-dialog') +}) + +ipcRenderer.on('information-dialog-selection', (event, index) => { + let message = 'You selected ' + if (index === 0) message += 'yes.' + else message += 'no.' + document.getElementById('info-selection').innerHTML = message +}) diff --git a/renderer-process/native-ui/dialogs/open-file.js b/renderer-process/native-ui/dialogs/open-file.js new file mode 100644 index 0000000..e152093 --- /dev/null +++ b/renderer-process/native-ui/dialogs/open-file.js @@ -0,0 +1,11 @@ +const {ipcRenderer} = require('electron') + +const selectDirBtn = document.getElementById('select-directory') + +selectDirBtn.addEventListener('click', (event) => { + ipcRenderer.send('open-file-dialog') +}) + +ipcRenderer.on('selected-directory', (event, path) => { + document.getElementById('selected-file').innerHTML = `You selected: ${path}` +}) diff --git a/renderer-process/native-ui/dialogs/save.js b/renderer-process/native-ui/dialogs/save.js new file mode 100644 index 0000000..fb79553 --- /dev/null +++ b/renderer-process/native-ui/dialogs/save.js @@ -0,0 +1,12 @@ +const {ipcRenderer} = require('electron') + +const saveBtn = document.getElementById('save-dialog') + +saveBtn.addEventListener('click', (event) => { + ipcRenderer.send('save-dialog') +}) + +ipcRenderer.on('saved-file', (event, path) => { + if (!path) path = 'No path' + document.getElementById('file-saved').innerHTML = `Path selected: ${path}` +}) diff --git a/renderer-process/native-ui/drag/drag.js b/renderer-process/native-ui/drag/drag.js new file mode 100644 index 0000000..dcc5ced --- /dev/null +++ b/renderer-process/native-ui/drag/drag.js @@ -0,0 +1,8 @@ +const {ipcRenderer} = require('electron') + +const dragFileLink = document.getElementById('drag-file-link') + +dragFileLink.addEventListener('dragstart', (event) => { + event.preventDefault() + ipcRenderer.send('ondragstart', __filename) +}) diff --git a/renderer-process/native-ui/ex-links-file-manager/ex-links.js b/renderer-process/native-ui/ex-links-file-manager/ex-links.js new file mode 100644 index 0000000..74d9fdf --- /dev/null +++ b/renderer-process/native-ui/ex-links-file-manager/ex-links.js @@ -0,0 +1,7 @@ +const {shell} = require('electron') + +const exLinksBtn = document.getElementById('open-ex-links') + +exLinksBtn.addEventListener('click', (event) => { + shell.openExternal('http://electron.atom.io') +}) diff --git a/renderer-process/native-ui/ex-links-file-manager/file-manager.js b/renderer-process/native-ui/ex-links-file-manager/file-manager.js new file mode 100644 index 0000000..b97e763 --- /dev/null +++ b/renderer-process/native-ui/ex-links-file-manager/file-manager.js @@ -0,0 +1,8 @@ +const {shell} = require('electron') +const os = require('os') + +const fileManagerBtn = document.getElementById('open-file-manager') + +fileManagerBtn.addEventListener('click', (event) => { + shell.showItemInFolder(os.homedir()) +}) diff --git a/renderer-process/native-ui/notifications/advanced-notification.js b/renderer-process/native-ui/notifications/advanced-notification.js new file mode 100644 index 0000000..7bed362 --- /dev/null +++ b/renderer-process/native-ui/notifications/advanced-notification.js @@ -0,0 +1,16 @@ +const path = require('path') + +const notification = { + title: 'Notification with image', + body: 'Short message plus a custom image', + icon: path.join(__dirname, '../../../assets/img/programming.png') +} +const notificationButton = document.getElementById('advanced-noti') + +notificationButton.addEventListener('click', () => { + const myNotification = new window.Notification(notification.title, notification) + + myNotification.onclick = () => { + console.log('Notification clicked') + } +}) diff --git a/renderer-process/native-ui/notifications/basic-notification.js b/renderer-process/native-ui/notifications/basic-notification.js new file mode 100644 index 0000000..a46583c --- /dev/null +++ b/renderer-process/native-ui/notifications/basic-notification.js @@ -0,0 +1,14 @@ +const notification = { + title: 'Basic Notification', + body: 'Short message part' +} + +const notificationButton = document.getElementById('basic-noti') + +notificationButton.addEventListener('click', () => { + const myNotification = new window.Notification(notification.title, notification) + + myNotification.onclick = () => { + console.log('Notification clicked') + } +}) diff --git a/renderer-process/native-ui/tray/tray.js b/renderer-process/native-ui/tray/tray.js new file mode 100644 index 0000000..d39da0e --- /dev/null +++ b/renderer-process/native-ui/tray/tray.js @@ -0,0 +1,23 @@ +const ipc = require('electron').ipcRenderer + +const trayBtn = document.getElementById('put-in-tray') +let trayOn = false + +trayBtn.addEventListener('click', function (event) { + if (trayOn) { + trayOn = false + document.getElementById('tray-countdown').innerHTML = '' + ipc.send('remove-tray') + } else { + trayOn = true + const message = 'Click demo again to remove.' + document.getElementById('tray-countdown').innerHTML = message + ipc.send('put-in-tray') + } +}) +// Tray removed from context menu on icon +ipc.on('tray-removed', function () { + ipc.send('remove-tray') + trayOn = false + document.getElementById('tray-countdown').innerHTML = '' +}) diff --git a/renderer-process/system/app-information.js b/renderer-process/system/app-information.js new file mode 100644 index 0000000..9e402e9 --- /dev/null +++ b/renderer-process/system/app-information.js @@ -0,0 +1,12 @@ +const {ipcRenderer} = require('electron') + +const appInfoBtn = document.getElementById('app-info') + +appInfoBtn.addEventListener('click', () => { + ipcRenderer.send('get-app-path') +}) + +ipcRenderer.on('got-app-path', (event, path) => { + const message = `This app is located at: ${path}` + document.getElementById('got-app-info').innerHTML = message +}) diff --git a/renderer-process/system/copy.js b/renderer-process/system/copy.js new file mode 100644 index 0000000..1ee1a33 --- /dev/null +++ b/renderer-process/system/copy.js @@ -0,0 +1,10 @@ +const {clipboard} = require('electron') + +const copyBtn = document.getElementById('copy-to') +const copyInput = document.getElementById('copy-to-input') + +copyBtn.addEventListener('click', () => { + if (copyInput.value !== '') copyInput.value = '' + copyInput.placeholder = 'Copied! Paste here to see.' + clipboard.writeText('Electron Demo!') +}) diff --git a/renderer-process/system/paste.js b/renderer-process/system/paste.js new file mode 100644 index 0000000..9725e2c --- /dev/null +++ b/renderer-process/system/paste.js @@ -0,0 +1,9 @@ +const {clipboard} = require('electron') + +const pasteBtn = document.getElementById('paste-to') + +pasteBtn.addEventListener('click', () => { + clipboard.writeText('What a demo!') + const message = `Clipboard contents: ${clipboard.readText()}` + document.getElementById('paste-from').innerHTML = message +}) diff --git a/renderer-process/system/protocol-handler.js b/renderer-process/system/protocol-handler.js new file mode 100644 index 0000000..2d831db --- /dev/null +++ b/renderer-process/system/protocol-handler.js @@ -0,0 +1,10 @@ +const {shell} = require('electron') +const path = require('path') + +const protocolHandlerBtn = document.getElementById('protocol-handler') + +protocolHandlerBtn.addEventListener('click', () => { + const pageDirectory = __dirname.replace('app.asar', 'app.asar.unpacked') + const pagePath = path.join('file://', pageDirectory, '../../sections/system/protocol-link.html') + shell.openExternal(pagePath) +}) diff --git a/renderer-process/system/screen-information.js b/renderer-process/system/screen-information.js new file mode 100644 index 0000000..08de1b9 --- /dev/null +++ b/renderer-process/system/screen-information.js @@ -0,0 +1,9 @@ +const {screen} = require('electron') + +const screenInfoBtn = document.getElementById('screen-info') +const size = screen.getPrimaryDisplay().size + +screenInfoBtn.addEventListener('click', () => { + const message = `Your screen is: ${size.width}px x ${size.height}px` + document.getElementById('got-screen-info').innerHTML = message +}) diff --git a/renderer-process/system/sys-information.js b/renderer-process/system/sys-information.js new file mode 100644 index 0000000..1da9f46 --- /dev/null +++ b/renderer-process/system/sys-information.js @@ -0,0 +1,9 @@ +const os = require('os') +const homeDir = os.homedir() + +const sysInfoBtn = document.getElementById('sys-info') + +sysInfoBtn.addEventListener('click', () => { + const message = `Your system home directory is: ${homeDir}` + document.getElementById('got-sys-info').innerHTML = message +}) diff --git a/renderer-process/system/version-information.js b/renderer-process/system/version-information.js new file mode 100644 index 0000000..40f7f2c --- /dev/null +++ b/renderer-process/system/version-information.js @@ -0,0 +1,8 @@ +const versionInfoBtn = document.getElementById('version-info') + +const electronVersion = process.versions.electron + +versionInfoBtn.addEventListener('click', () => { + const message = `This app is using Electron version: ${electronVersion}` + document.getElementById('got-version-info').innerHTML = message +}) diff --git a/renderer-process/windows/create-window.js b/renderer-process/windows/create-window.js new file mode 100644 index 0000000..105a199 --- /dev/null +++ b/renderer-process/windows/create-window.js @@ -0,0 +1,13 @@ +const {BrowserWindow} = require('electron').remote +const path = require('path') + +const newWindowBtn = document.getElementById('new-window') + +newWindowBtn.addEventListener('click', (event) => { + const modalPath = path.join('file://', __dirname, '../../sections/windows/modal.html') + let win = new BrowserWindow({ width: 400, height: 320 }) + + win.on('close', () => { win = null }) + win.loadURL(modalPath) + win.show() +}) diff --git a/renderer-process/windows/frameless-window.js b/renderer-process/windows/frameless-window.js new file mode 100644 index 0000000..4c67e33 --- /dev/null +++ b/renderer-process/windows/frameless-window.js @@ -0,0 +1,13 @@ +const {BrowserWindow} = require('electron').remote +const newWindowBtn = document.getElementById('frameless-window') + +const path = require('path') + +newWindowBtn.addEventListener('click', (event) => { + const modalPath = path.join('file://', __dirname, '../../sections/windows/modal.html') + let win = new BrowserWindow({ frame: false }) + + win.on('close', () => { win = null }) + win.loadURL(modalPath) + win.show() +}) diff --git a/renderer-process/windows/manage-window.js b/renderer-process/windows/manage-window.js new file mode 100644 index 0000000..06b8c97 --- /dev/null +++ b/renderer-process/windows/manage-window.js @@ -0,0 +1,22 @@ +const {BrowserWindow} = require('electron').remote +const path = require('path') + +const manageWindowBtn = document.getElementById('manage-window') +let win + +manageWindowBtn.addEventListener('click', (event) => { + const modalPath = path.join('file://', __dirname, '../../sections/windows/manage-modal.html') + win = new BrowserWindow({ width: 400, height: 275 }) + + win.on('resize', updateReply) + win.on('move', updateReply) + win.on('close', () => { win = null }) + win.loadURL(modalPath) + win.show() + + function updateReply () { + const manageWindowReply = document.getElementById('manage-window-reply') + const message = `Size: ${win.getSize()} Position: ${win.getPosition()}` + manageWindowReply.innerText = message + } +}) diff --git a/renderer-process/windows/process-crash.js b/renderer-process/windows/process-crash.js new file mode 100644 index 0000000..95935e2 --- /dev/null +++ b/renderer-process/windows/process-crash.js @@ -0,0 +1,33 @@ +const {BrowserWindow, dialog} = require('electron').remote +const path = require('path') + +const processCrashBtn = document.getElementById('process-crash') + +processCrashBtn.addEventListener('click', (event) => { + const crashWinPath = path.join('file://', __dirname, '../../sections/windows/process-crash.html') + let win = new BrowserWindow({ + width: 400, + height: 320, + webPreferences: { + nodeIntegration: true + } + }); + + win.webContents.on('crashed', () => { + const options = { + type: 'info', + title: 'Renderer Process Crashed', + message: 'This process has crashed.', + buttons: ['Reload', 'Close'] + } + + dialog.showMessageBox(options, (index) => { + if (index === 0) win.reload() + else win.close() + }) + }) + + win.on('close', () => { win = null }) + win.loadURL(crashWinPath) + win.show() +}) diff --git a/renderer-process/windows/process-hang.js b/renderer-process/windows/process-hang.js new file mode 100644 index 0000000..8a0f284 --- /dev/null +++ b/renderer-process/windows/process-hang.js @@ -0,0 +1,33 @@ +const {BrowserWindow, dialog} = require('electron').remote +const path = require('path') + +const processHangBtn = document.getElementById('process-hang') + +processHangBtn.addEventListener('click', (event) => { + const hangWinPath = path.join('file://', __dirname, '../../sections/windows/process-hang.html') + let win = new BrowserWindow({ + width: 400, + height: 320, + webPreferences: { + nodeIntegration: true + } + }); + + win.on('unresponsive', () => { + const options = { + type: 'info', + title: 'Renderer Process Hanging', + message: 'This process is hanging.', + buttons: ['Reload', 'Close'] + } + + dialog.showMessageBox(options, (index) => { + if (index === 0) win.reload() + else win.close() + }) + }) + + win.on('close', () => { win = null }) + win.loadURL(hangWinPath) + win.show() +}) diff --git a/renderer-process/windows/using-window-events.js b/renderer-process/windows/using-window-events.js new file mode 100644 index 0000000..34a1991 --- /dev/null +++ b/renderer-process/windows/using-window-events.js @@ -0,0 +1,35 @@ +const {BrowserWindow} = require('electron').remote +const path = require('path') + +const manageWindowBtn = document.getElementById('listen-to-window') +const focusModalBtn = document.getElementById('focus-on-modal-window') +let win + +manageWindowBtn.addEventListener('click', () => { + const modalPath = path.join('file://', __dirname, '../../sections/windows/modal-toggle-visibility.html') + win = new BrowserWindow({ width: 600, height: 400 }) + + const hideFocusBtn = () => { + focusModalBtn.classList.add('disappear') + focusModalBtn.classList.remove('smooth-appear') + focusModalBtn.removeEventListener('click', clickHandler) + } + + const showFocusBtn = (btn) => { + if (!win) return + focusModalBtn.classList.add('smooth-appear') + focusModalBtn.classList.remove('disappear') + focusModalBtn.addEventListener('click', clickHandler) + } + + win.on('focus', hideFocusBtn) + win.on('blur', showFocusBtn) + win.on('close', () => { + hideFocusBtn() + win = null + }) + win.loadURL(modalPath) + win.show() + + const clickHandler = () => { win.focus() } +}) diff --git a/script/installer.js b/script/installer.js new file mode 100644 index 0000000..976a68f --- /dev/null +++ b/script/installer.js @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +const createWindowsInstaller = require('electron-winstaller').createWindowsInstaller +const path = require('path') +const rimraf = require('rimraf') + +deleteOutputFolder() + .then(getInstallerConfig) + .then(createWindowsInstaller) + .catch((error) => { + console.error(error.message || error) + process.exit(1) + }) + +function getInstallerConfig () { + const rootPath = path.join(__dirname, '..') + const outPath = path.join(rootPath, 'out') + + return Promise.resolve({ + appDirectory: path.join(outPath, 'Electron API Demos-win32-ia32'), + exe: 'Electron API Demos.exe', + iconUrl: 'https://raw.githubusercontent.com/electron/electron-api-demos/master/assets/app-icon/win/app.ico', + loadingGif: path.join(rootPath, 'assets', 'img', 'loading.gif'), + noMsi: true, + outputDirectory: path.join(outPath, 'windows-installer'), + setupExe: 'ElectronAPIDemosSetup.exe', + setupIcon: path.join(rootPath, 'assets', 'app-icon', 'win', 'app.ico'), + skipUpdateIcon: true + }) +} + +function deleteOutputFolder () { + return new Promise((resolve, reject) => { + rimraf(path.join(__dirname, '..', 'out', 'windows-installer'), (error) => { + error ? reject(error) : resolve() + }) + }) +} diff --git a/script/mas.sh b/script/mas.sh new file mode 100644 index 0000000..6fa030d --- /dev/null +++ b/script/mas.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +set -ex + +# App Store does not allow the word "demos" in the app's name +APP="Electron APIs" + +electron-packager . \ + "$APP" \ + --asar \ + --asar-unpack=protocol-link.html \ + --overwrite \ + --platform=mas \ + --app-bundle-id=com.github.electron-api-demos \ + --app-version="$npm_package_version" \ + --build-version="1.1.0" \ + --arch=x64 \ + --icon=assets/app-icon/mac/app.icns \ + --prune=true \ + --out=out \ + --extend-info=assets/mac/info.plist + +APP_PATH="./out/$APP-mas-x64/$APP.app" +RESULT_PATH="./out/$APP.pkg" +APP_KEY="3rd Party Mac Developer Application: GitHub (VEKTX9H2N7)" +INSTALLER_KEY="3rd Party Mac Developer Installer: GitHub (VEKTX9H2N7)" +FRAMEWORKS_PATH="$APP_PATH/Contents/Frameworks" +CHILD_PLIST="./assets/mac/child.plist" +PARENT_PLIST="./assets/mac/parent.plist" + +codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Electron Framework" +codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libffmpeg.dylib" +codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libnode.dylib" +codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework" +codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper.app/Contents/MacOS/$APP Helper" +codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper.app/" +codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper EH.app/Contents/MacOS/$APP Helper EH" +codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper EH.app/" +codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper NP.app/Contents/MacOS/$APP Helper NP" +codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper NP.app/" +codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$APP_PATH/Contents/MacOS/$APP" + +codesign -s "$APP_KEY" -f --entitlements "$PARENT_PLIST" "$APP_PATH" + +productbuild --component "$APP_PATH" /Applications --sign "$INSTALLER_KEY" "$RESULT_PATH" diff --git a/script/release.js b/script/release.js new file mode 100644 index 0000000..1878dff --- /dev/null +++ b/script/release.js @@ -0,0 +1,165 @@ +#!/usr/bin/env node + +const childProcess = require('child_process') +const fs = require('fs') +const path = require('path') +const octokit = require('@octokit/rest') + +const token = process.env.ELECTRON_API_DEMO_GITHUB_TOKEN +const version = require('../package').version +const github = octokit({ + timeout: 30 * 1000, + 'user-agent': `node/${process.versions.node}` +}) + +if (!token) { + console.error('ELECTRON_API_DEMO_GITHUB_TOKEN environment variable not set\nSet it to a token with repo scope created from https://github.com/settings/tokens/new') + process.exit(1) +} + +github.authenticate({ + type: 'token', + token: token +}) + +async function doRelease () { + const release = await getOrCreateRelease() + const assets = await prepareAssets() + await uploadAssets(release, assets) + await publishRelease(release) + console.log('Done!') +} + +doRelease().catch(err => { + console.error(err.message || err) + process.exit(1) +}) + +function prepareAssets () { + const outPath = path.join(__dirname, '..', 'out') + + const zipAssets = [{ + name: 'electron-api-demos-mac.zip', + path: path.join(outPath, 'Electron API Demos-darwin-x64', 'Electron API Demos.app') + }, { + name: 'electron-api-demos-windows.zip', + path: path.join(outPath, 'Electron API Demos-win32-ia32') + }, { + name: 'electron-api-demos-linux.zip', + path: path.join(outPath, 'Electron API Demos-linux-x64') + }] + + return Promise.all(zipAssets.map(zipAsset)).then((zipAssets) => { + return zipAssets.concat([{ + name: 'RELEASES', + path: path.join(outPath, 'windows-installer', 'RELEASES') + }, { + name: 'ElectronAPIDemosSetup.exe', + path: path.join(outPath, 'windows-installer', 'ElectronAPIDemosSetup.exe') + }, { + name: `electron-api-demos-${version}-full.nupkg`, + path: path.join(outPath, 'windows-installer', `electron-api-demos-${version}-full.nupkg`) + }]) + }) +} + +function zipAsset (asset) { + return new Promise((resolve, reject) => { + const assetBase = path.basename(asset.path) + const assetDirectory = path.dirname(asset.path) + console.log(`Zipping ${assetBase} to ${asset.name}`) + + if (!fs.existsSync(asset.path)) { + return reject(new Error(`${asset.path} does not exist`)) + } + + const zipCommand = `zip --recurse-paths --symlinks '${asset.name}' '${assetBase}'` + const options = {cwd: assetDirectory, maxBuffer: Infinity} + childProcess.exec(zipCommand, options, (error) => { + if (error) { + reject(error) + } else { + asset.path = path.join(assetDirectory, asset.name) + resolve(asset) + } + }) + }) +} + +async function getOrCreateRelease () { + const { data: releases } = await github.repos.listReleases({ + owner: 'electron', + repo: 'electron-api-demos', + per_page: 100, + page: 1 + }) + const existingRelease = releases.find(release => release.tag_name === `v${version}` && release.draft === true) + if (existingRelease) { + console.log(`Using existing draft release for v${version}`) + return existingRelease + } + + console.log('Creating new draft release') + const { data: release } = await github.repos.createRelease({ + owner: 'electron', + repo: 'electron-api-demos', + tag_name: `v${version}`, + target_commitish: 'master', + name: version, + body: 'An awesome new release :tada:', + draft: true, + prerelease: false + }) + return release +} + +async function uploadAssets (release, assets) { + for (const asset of assets) { + if (release.assets.some(ghAsset => ghAsset.name === asset.name)) { + console.log(`Skipping already uploaded asset ${asset.name}`) + } else { + process.stdout.write(`Uploading ${asset.name}... `) + try { + await uploadAsset(release, asset) + } catch (err) { + if (err.name === 'HttpError' && err.message.startsWith('network timeout')) { + console.error('\n') + console.error(` There was a network timeout while uploading ${asset.name}.`) + console.error(' This likely resulted in a bad asset; please visit the release at') + console.error(` ${release.html_url} and manually remove the bad asset,`) + console.error(` then run this script again to continue where you left off.`) + console.error('') + process.exit(2) + } else { + throw err + } + } + + process.stdout.write('Success!\n') + // [mkt] Waiting a bit between uploads seems to increase success rate + await new Promise(resolve => setTimeout(resolve, 5000)) + } + } +} + +function uploadAsset (release, asset) { + return github.repos.uploadReleaseAsset({ + headers: { + 'content-type': 'application/octet-stream', + 'content-length': fs.statSync(asset.path).size + }, + url: release.upload_url, + file: fs.createReadStream(asset.path), + name: asset.name + }) +} + +function publishRelease (release) { + console.log('Publishing release') + return github.repos.updateRelease({ + owner: 'electron', + repo: 'electron-api-demos', + release_id: release.id, + draft: false + }) +} diff --git a/script/windows-store.js b/script/windows-store.js new file mode 100644 index 0000000..0c0e282 --- /dev/null +++ b/script/windows-store.js @@ -0,0 +1,29 @@ +const ChildProcess = require('child_process') +const path = require('path') + +const metadata = require('../package') + +const command = path.join(__dirname, '..', 'node_modules', '.bin', 'electron-windows-store.cmd') +const args = [ + '--input-directory', + path.join(__dirname, '..', 'out', 'ElectronAPIDemos-win32-ia32'), + '--output-directory', + path.join(__dirname, '..', 'out', 'windows-store'), + '--flatten', + true, + '--package-version', + metadata.version + '.0', + '--package-name', + metadata.name, + '--package-display-name', + metadata.productName, + '--assets', + path.join(__dirname, '..', 'assets', 'tiles'), + '--package-description', + metadata.description +] + +const windowsStore = ChildProcess.spawn(command, args, {stdio: 'inherit'}) +windowsStore.on('close', (code) => { + process.exit(code) +}) diff --git a/sections/about.html b/sections/about.html new file mode 100644 index 0000000..3987bb9 --- /dev/null +++ b/sections/about.html @@ -0,0 +1,32 @@ + diff --git a/sections/communication/invisible.html b/sections/communication/invisible.html new file mode 100644 index 0000000..804e5f1 --- /dev/null +++ b/sections/communication/invisible.html @@ -0,0 +1,18 @@ + + + diff --git a/sections/communication/ipc.html b/sections/communication/ipc.html new file mode 100644 index 0000000..4dd9e38 --- /dev/null +++ b/sections/communication/ipc.html @@ -0,0 +1,85 @@ + diff --git a/sections/media/desktop-capturer.html b/sections/media/desktop-capturer.html new file mode 100644 index 0000000..eb30558 --- /dev/null +++ b/sections/media/desktop-capturer.html @@ -0,0 +1,38 @@ + diff --git a/sections/menus/menus.html b/sections/menus/menus.html new file mode 100644 index 0000000..5b3cfa0 --- /dev/null +++ b/sections/menus/menus.html @@ -0,0 +1,70 @@ + diff --git a/sections/menus/shortcuts.html b/sections/menus/shortcuts.html new file mode 100644 index 0000000..8e92bb1 --- /dev/null +++ b/sections/menus/shortcuts.html @@ -0,0 +1,72 @@ + diff --git a/sections/native-ui/dialogs.html b/sections/native-ui/dialogs.html new file mode 100644 index 0000000..dcba621 --- /dev/null +++ b/sections/native-ui/dialogs.html @@ -0,0 +1,121 @@ + diff --git a/sections/native-ui/drag.html b/sections/native-ui/drag.html new file mode 100644 index 0000000..69844d7 --- /dev/null +++ b/sections/native-ui/drag.html @@ -0,0 +1,42 @@ + diff --git a/sections/native-ui/ex-links-file-manager.html b/sections/native-ui/ex-links-file-manager.html new file mode 100644 index 0000000..da49e7b --- /dev/null +++ b/sections/native-ui/ex-links-file-manager.html @@ -0,0 +1,64 @@ + diff --git a/sections/native-ui/notifications.html b/sections/native-ui/notifications.html new file mode 100644 index 0000000..46ebcb0 --- /dev/null +++ b/sections/native-ui/notifications.html @@ -0,0 +1,57 @@ + diff --git a/sections/native-ui/tray.html b/sections/native-ui/tray.html new file mode 100644 index 0000000..715b2aa --- /dev/null +++ b/sections/native-ui/tray.html @@ -0,0 +1,48 @@ + diff --git a/sections/system/app-sys-information.html b/sections/system/app-sys-information.html new file mode 100644 index 0000000..b60f808 --- /dev/null +++ b/sections/system/app-sys-information.html @@ -0,0 +1,121 @@ + diff --git a/sections/system/clipboard.html b/sections/system/clipboard.html new file mode 100644 index 0000000..8c0bb4f --- /dev/null +++ b/sections/system/clipboard.html @@ -0,0 +1,57 @@ + diff --git a/sections/system/protocol-handler.html b/sections/system/protocol-handler.html new file mode 100644 index 0000000..24107f2 --- /dev/null +++ b/sections/system/protocol-handler.html @@ -0,0 +1,44 @@ + diff --git a/sections/system/protocol-link.html b/sections/system/protocol-link.html new file mode 100644 index 0000000..7c2423c --- /dev/null +++ b/sections/system/protocol-link.html @@ -0,0 +1,29 @@ + + + +

electron-api-demos://open

+

Click the link above to return to Electron API Demos.

+ + diff --git a/sections/windows/crash-hang.html b/sections/windows/crash-hang.html new file mode 100644 index 0000000..1a8424f --- /dev/null +++ b/sections/windows/crash-hang.html @@ -0,0 +1,68 @@ + diff --git a/sections/windows/manage-modal.html b/sections/windows/manage-modal.html new file mode 100644 index 0000000..83c6a32 --- /dev/null +++ b/sections/windows/manage-modal.html @@ -0,0 +1,23 @@ + +

Resize or move the window. See the size and position in the main window.

+Close this Window diff --git a/sections/windows/modal-toggle-visibility.html b/sections/windows/modal-toggle-visibility.html new file mode 100644 index 0000000..83af15d --- /dev/null +++ b/sections/windows/modal-toggle-visibility.html @@ -0,0 +1,23 @@ + +

Click on the parent window to see how the "focus on demo" button appears.

+Close this Window \ No newline at end of file diff --git a/sections/windows/modal.html b/sections/windows/modal.html new file mode 100644 index 0000000..3963f3f --- /dev/null +++ b/sections/windows/modal.html @@ -0,0 +1,33 @@ + + +

Hello World!

+Close this Window diff --git a/sections/windows/process-crash.html b/sections/windows/process-crash.html new file mode 100644 index 0000000..cabb1e9 --- /dev/null +++ b/sections/windows/process-crash.html @@ -0,0 +1,24 @@ + + +

Click the text below to crash and then reload this process.

+Crash this process diff --git a/sections/windows/process-hang.html b/sections/windows/process-hang.html new file mode 100644 index 0000000..fb4604e --- /dev/null +++ b/sections/windows/process-hang.html @@ -0,0 +1,29 @@ + + +

Click the text below to hang and then reload this process.

+(This will take up to 30 seconds.) + +Hang this process diff --git a/sections/windows/windows.html b/sections/windows/windows.html new file mode 100644 index 0000000..5513347 --- /dev/null +++ b/sections/windows/windows.html @@ -0,0 +1,121 @@ + diff --git a/test/index.js b/test/index.js new file mode 100644 index 0000000..30f7b18 --- /dev/null +++ b/test/index.js @@ -0,0 +1,133 @@ +'use strict' + +const Application = require('spectron').Application +const electron = require('electron') +const chai = require('chai') +const chaiAsPromised = require('chai-as-promised') +const path = require('path') +const setup = require('./setup') + +chai.should() +chai.use(chaiAsPromised) + +const timeout = process.env.CI ? 30000 : 10000 + +describe('demo app', function () { + this.timeout(timeout) + + let app + + const startApp = () => { + app = new Application({ + path: electron, + args: [ + path.join(__dirname, '..') + ], + waitTimeout: timeout + }) + + return app.start().then((ret) => { + setup.setupApp(ret) + }) + } + + const restartApp = () => { + return app.restart().then((ret) => { + setup.setupApp(ret) + }) + } + + before(() => { + setup.removeStoredPreferences() + return startApp() + }) + + after(() => { + if (app && app.isRunning()) { + return app.stop() + } + }) + + it('checks hardcoded path for userData is correct', function () { + return app.client.execute(() => { + return require('electron').remote.app.getPath('userData') + }).then((result) => { + return result.value + }).should.eventually.equal(setup.getUserDataPath()) + }) + + it('opens a window displaying the about page', function () { + return app.client.getWindowCount().should.eventually.equal(1) + .browserWindow.isMinimized().should.eventually.be.false + .browserWindow.isDevToolsOpened().should.eventually.be.false + .browserWindow.isVisible().should.eventually.be.true + .browserWindow.isFocused().should.eventually.be.true + .browserWindow.getBounds().should.eventually.have.property('width').and.be.above(0) + .browserWindow.getBounds().should.eventually.have.property('height').and.be.above(0) + .browserWindow.getTitle().should.eventually.equal('Electron API Demos') + .waitForVisible('#about-modal').should.eventually.be.true + .isVisible('.js-nav').should.eventually.be.false + .click('button[id="get-started"]').pause(500) + .isVisible('#about-modal').should.eventually.be.false + .isVisible('.js-nav').should.eventually.be.true + }) + + it('does not contain any accessibility warnings or errors', function () { + return app.client.dismissAboutPage() + .auditSectionAccessibility('windows') + .auditSectionAccessibility('crash-hang') + .auditSectionAccessibility('menus') + .auditSectionAccessibility('shortcuts') + .auditSectionAccessibility('ex-links-file-manager') + .auditSectionAccessibility('notifications') + .auditSectionAccessibility('dialogs') + .auditSectionAccessibility('tray') + .auditSectionAccessibility('ipc') + .auditSectionAccessibility('app-sys-information') + .auditSectionAccessibility('clipboard') + .auditSectionAccessibility('protocol') + .auditSectionAccessibility('desktop-capturer') + }) + + describe('when clicking on a section from the nav bar', function () { + it('it shows the selected section in the main area', function () { + return app.client.dismissAboutPage() + .selectSection('windows') + .isExisting('button.is-selected[data-section="windows"]').should.eventually.be.true + .isVisible('#menus-section').should.eventually.be.false + .selectSection('menus') + .isVisible('#windows-section').should.eventually.be.false + .isExisting('button.is-selected[data-section="windows"]').should.eventually.be.false + .isExisting('button.is-selected[data-section="menus"]').should.eventually.be.true + }) + }) + + describe('when a demo title is clicked', function () { + it('it expands the demo content', function () { + let onlyFirstVisible = Array(30).fill(false) + onlyFirstVisible[0] = true + + return app.client.dismissAboutPage() + .collapseDemos() + .selectSection('windows') + .click('.js-container-target') + .waitForVisible('.demo-box') + .isVisible('.demo-box').should.eventually.deep.equal(onlyFirstVisible) + }) + }) + + describe('when the app is restarted after use', function () { + it('it launches at last visited section & demo', function () { + let onlyFirstVisible = Array(30).fill(false) + onlyFirstVisible[0] = true + + return app.client.waitForVisible('#windows-section') + .then(restartApp) + .then(function () { + return app.client.waitForVisible('#windows-section') + .isVisible('#windows-section').should.eventually.be.true + .isVisible('.demo-box').should.eventually.deep.equal(onlyFirstVisible) + }) + }) + }) +}) diff --git a/test/setup.js b/test/setup.js new file mode 100644 index 0000000..c9fb645 --- /dev/null +++ b/test/setup.js @@ -0,0 +1,83 @@ +'use strict' + +const path = require('path') +const fs = require('fs') +const chaiAsPromised = require('chai-as-promised') + +const getUserDataPath = function () { + const productName = require('../package').productName + switch (process.platform) { + case 'darwin': + return path.join(process.env.HOME, 'Library', 'Application Support', productName) + case 'win32': + return path.join(process.env.APPDATA, productName) + case 'freebsd': + case 'linux': + case 'sunos': + return path.join(process.env.HOME, '.config', productName) + default: + throw new Error(`Unknown userDataPath path for platform ${process.platform}`) + } +} + +const removeStoredPreferences = () => { + const userDataPath = getUserDataPath() + try { + fs.unlinkSync(path.join(userDataPath, 'Settings')) + } catch (error) { + if (error.code !== 'ENOENT') throw error + } +} + +const setupApp = function (app) { + app.client.addCommand('dismissAboutPage', function () { + return this.isVisible('.js-nav').then(function (navVisible) { + if (!navVisible) { + return this.click('button[id="get-started"]').pause(500) + } + }) + }) + + app.client.addCommand('selectSection', function (section) { + return this.click('button[data-section="' + section + '"]').pause(100) + .waitForVisible('#' + section + '-section') + }) + + app.client.addCommand('expandDemos', function () { + return this.execute(function () { + for (let demo of document.querySelectorAll('.demo-wrapper')) { + demo.classList.add('is-open') + } + }) + }) + + app.client.addCommand('collapseDemos', function () { + return this.execute(function () { + for (let demo of document.querySelectorAll('.demo-wrapper')) { + demo.classList.remove('is-open') + } + }) + }) + + app.client.addCommand('auditSectionAccessibility', function (section) { + const options = { + ignoreRules: ['AX_COLOR_01', 'AX_TITLE_01'] + } + return this.selectSection(section) + .expandDemos() + .auditAccessibility(options).then(function (audit) { + if (audit.failed) { + throw Error(section + ' section failed accessibility audit\n' + audit.message) + } + }) + }) + + chaiAsPromised.transferPromiseness = app.transferPromiseness + return app.client.waitUntilWindowLoaded() +} + +module.exports = { + removeStoredPreferences, + getUserDataPath, + setupApp +}