├── .gitignore ├── LICENSE ├── README.md ├── docs ├── CNAME ├── Gemfile ├── Gemfile.lock ├── _config.yml ├── _layouts │ └── default.html ├── index.md ├── screenshot.jpg └── theme.md ├── global_shortcuts.js ├── icon.icns ├── index.html ├── loader.svg ├── main.js ├── menu.js ├── package-lock.json ├── package-release.sh ├── package.json ├── renderer.js └── style.css /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | bin 3 | .sass-cache 4 | _site 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Please note I'm not currently maintaining this project. Try [this great alternative](https://github.com/insidegui/PodcastMenu) 2 | 3 | 4 | Use Overcast as a native macOS application. 5 | 6 | ![Screenshot of Overcast for Mac in action](https://overcastformac.nathanbirrell.me/screenshot.jpg) 7 | 8 | ## Why? 9 | 10 | * Use your keyboard's media keys (play/pause/skip/prev) 11 | * Alt-tab your way to Overcast, instead of using a browser tab 12 | * Remembers your state, so you can pick up where you left off 13 | 14 | ## Planned Features 15 | 16 | * Option to show in the macOS menu bar 17 | 18 | ## Download 19 | 20 | [Download Latest](https://github.com/nathanbirrell/overcast-macos/releases/latest) 21 | 22 | ## Ideas? 23 | 24 | [Create an issue](https://github.com/nathanbirrell/overcast-macos/issues) 25 | 26 | or simply fork and pull request :) 27 | 28 | ## Develop 29 | 30 | `npm run start` 31 | 32 | Build: 33 | 34 | `./package-release.sh` 35 | 36 | ## Disclaimer 37 | 38 | This application is in no way affiliated with [Overcast](https://overcast.fm), I use this app a lot on my iPhone and wish I could use it on my Mac too, so I built this. [Get Overcast for iOS here](https://itunes.apple.com/app/overcast-podcast-player/id888422857). 39 | 40 | *Please note: as this is a free application and I am not on the Apple Developer Program to sign it. This means you will get an "Unidentified Developer" warning from macOS's Gatekeeper. [Go here to open the app regardless](https://support.apple.com/kb/PH25088?locale=en_US)* 41 | -------------------------------------------------------------------------------- /docs/CNAME: -------------------------------------------------------------------------------- 1 | overcastformac.nathanbirrell.me 2 | -------------------------------------------------------------------------------- /docs/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | gem 'github-pages', group: :jekyll_plugins 3 | -------------------------------------------------------------------------------- /docs/Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | activesupport (4.2.10) 5 | i18n (~> 0.7) 6 | minitest (~> 5.1) 7 | thread_safe (~> 0.3, >= 0.3.4) 8 | tzinfo (~> 1.1) 9 | addressable (2.5.2) 10 | public_suffix (>= 2.0.2, < 4.0) 11 | coffee-script (2.4.1) 12 | coffee-script-source 13 | execjs 14 | coffee-script-source (1.11.1) 15 | colorator (1.1.0) 16 | commonmarker (0.17.13) 17 | ruby-enum (~> 0.5) 18 | concurrent-ruby (1.1.3) 19 | dnsruby (1.61.2) 20 | addressable (~> 2.5) 21 | em-websocket (0.5.1) 22 | eventmachine (>= 0.12.9) 23 | http_parser.rb (~> 0.6.0) 24 | ethon (0.11.0) 25 | ffi (>= 1.3.0) 26 | eventmachine (1.2.7) 27 | execjs (2.7.0) 28 | faraday (0.15.3) 29 | multipart-post (>= 1.2, < 3) 30 | ffi (1.9.25) 31 | forwardable-extended (2.6.0) 32 | gemoji (3.0.0) 33 | github-pages (193) 34 | activesupport (= 4.2.10) 35 | github-pages-health-check (= 1.8.1) 36 | jekyll (= 3.7.4) 37 | jekyll-avatar (= 0.6.0) 38 | jekyll-coffeescript (= 1.1.1) 39 | jekyll-commonmark-ghpages (= 0.1.5) 40 | jekyll-default-layout (= 0.1.4) 41 | jekyll-feed (= 0.11.0) 42 | jekyll-gist (= 1.5.0) 43 | jekyll-github-metadata (= 2.9.4) 44 | jekyll-mentions (= 1.4.1) 45 | jekyll-optional-front-matter (= 0.3.0) 46 | jekyll-paginate (= 1.1.0) 47 | jekyll-readme-index (= 0.2.0) 48 | jekyll-redirect-from (= 0.14.0) 49 | jekyll-relative-links (= 0.5.3) 50 | jekyll-remote-theme (= 0.3.1) 51 | jekyll-sass-converter (= 1.5.2) 52 | jekyll-seo-tag (= 2.5.0) 53 | jekyll-sitemap (= 1.2.0) 54 | jekyll-swiss (= 0.4.0) 55 | jekyll-theme-architect (= 0.1.1) 56 | jekyll-theme-cayman (= 0.1.1) 57 | jekyll-theme-dinky (= 0.1.1) 58 | jekyll-theme-hacker (= 0.1.1) 59 | jekyll-theme-leap-day (= 0.1.1) 60 | jekyll-theme-merlot (= 0.1.1) 61 | jekyll-theme-midnight (= 0.1.1) 62 | jekyll-theme-minimal (= 0.1.1) 63 | jekyll-theme-modernist (= 0.1.1) 64 | jekyll-theme-primer (= 0.5.3) 65 | jekyll-theme-slate (= 0.1.1) 66 | jekyll-theme-tactile (= 0.1.1) 67 | jekyll-theme-time-machine (= 0.1.1) 68 | jekyll-titles-from-headings (= 0.5.1) 69 | jemoji (= 0.10.1) 70 | kramdown (= 1.17.0) 71 | liquid (= 4.0.0) 72 | listen (= 3.1.5) 73 | mercenary (~> 0.3) 74 | minima (= 2.5.0) 75 | nokogiri (>= 1.8.2, < 2.0) 76 | rouge (= 2.2.1) 77 | terminal-table (~> 1.4) 78 | github-pages-health-check (1.8.1) 79 | addressable (~> 2.3) 80 | dnsruby (~> 1.60) 81 | octokit (~> 4.0) 82 | public_suffix (~> 2.0) 83 | typhoeus (~> 1.3) 84 | html-pipeline (2.9.1) 85 | activesupport (>= 2) 86 | nokogiri (>= 1.4) 87 | http_parser.rb (0.6.0) 88 | i18n (0.9.5) 89 | concurrent-ruby (~> 1.0) 90 | jekyll (3.7.4) 91 | addressable (~> 2.4) 92 | colorator (~> 1.0) 93 | em-websocket (~> 0.5) 94 | i18n (~> 0.7) 95 | jekyll-sass-converter (~> 1.0) 96 | jekyll-watch (~> 2.0) 97 | kramdown (~> 1.14) 98 | liquid (~> 4.0) 99 | mercenary (~> 0.3.3) 100 | pathutil (~> 0.9) 101 | rouge (>= 1.7, < 4) 102 | safe_yaml (~> 1.0) 103 | jekyll-avatar (0.6.0) 104 | jekyll (~> 3.0) 105 | jekyll-coffeescript (1.1.1) 106 | coffee-script (~> 2.2) 107 | coffee-script-source (~> 1.11.1) 108 | jekyll-commonmark (1.2.0) 109 | commonmarker (~> 0.14) 110 | jekyll (>= 3.0, < 4.0) 111 | jekyll-commonmark-ghpages (0.1.5) 112 | commonmarker (~> 0.17.6) 113 | jekyll-commonmark (~> 1) 114 | rouge (~> 2) 115 | jekyll-default-layout (0.1.4) 116 | jekyll (~> 3.0) 117 | jekyll-feed (0.11.0) 118 | jekyll (~> 3.3) 119 | jekyll-gist (1.5.0) 120 | octokit (~> 4.2) 121 | jekyll-github-metadata (2.9.4) 122 | jekyll (~> 3.1) 123 | octokit (~> 4.0, != 4.4.0) 124 | jekyll-mentions (1.4.1) 125 | html-pipeline (~> 2.3) 126 | jekyll (~> 3.0) 127 | jekyll-optional-front-matter (0.3.0) 128 | jekyll (~> 3.0) 129 | jekyll-paginate (1.1.0) 130 | jekyll-readme-index (0.2.0) 131 | jekyll (~> 3.0) 132 | jekyll-redirect-from (0.14.0) 133 | jekyll (~> 3.3) 134 | jekyll-relative-links (0.5.3) 135 | jekyll (~> 3.3) 136 | jekyll-remote-theme (0.3.1) 137 | jekyll (~> 3.5) 138 | rubyzip (>= 1.2.1, < 3.0) 139 | jekyll-sass-converter (1.5.2) 140 | sass (~> 3.4) 141 | jekyll-seo-tag (2.5.0) 142 | jekyll (~> 3.3) 143 | jekyll-sitemap (1.2.0) 144 | jekyll (~> 3.3) 145 | jekyll-swiss (0.4.0) 146 | jekyll-theme-architect (0.1.1) 147 | jekyll (~> 3.5) 148 | jekyll-seo-tag (~> 2.0) 149 | jekyll-theme-cayman (0.1.1) 150 | jekyll (~> 3.5) 151 | jekyll-seo-tag (~> 2.0) 152 | jekyll-theme-dinky (0.1.1) 153 | jekyll (~> 3.5) 154 | jekyll-seo-tag (~> 2.0) 155 | jekyll-theme-hacker (0.1.1) 156 | jekyll (~> 3.5) 157 | jekyll-seo-tag (~> 2.0) 158 | jekyll-theme-leap-day (0.1.1) 159 | jekyll (~> 3.5) 160 | jekyll-seo-tag (~> 2.0) 161 | jekyll-theme-merlot (0.1.1) 162 | jekyll (~> 3.5) 163 | jekyll-seo-tag (~> 2.0) 164 | jekyll-theme-midnight (0.1.1) 165 | jekyll (~> 3.5) 166 | jekyll-seo-tag (~> 2.0) 167 | jekyll-theme-minimal (0.1.1) 168 | jekyll (~> 3.5) 169 | jekyll-seo-tag (~> 2.0) 170 | jekyll-theme-modernist (0.1.1) 171 | jekyll (~> 3.5) 172 | jekyll-seo-tag (~> 2.0) 173 | jekyll-theme-primer (0.5.3) 174 | jekyll (~> 3.5) 175 | jekyll-github-metadata (~> 2.9) 176 | jekyll-seo-tag (~> 2.0) 177 | jekyll-theme-slate (0.1.1) 178 | jekyll (~> 3.5) 179 | jekyll-seo-tag (~> 2.0) 180 | jekyll-theme-tactile (0.1.1) 181 | jekyll (~> 3.5) 182 | jekyll-seo-tag (~> 2.0) 183 | jekyll-theme-time-machine (0.1.1) 184 | jekyll (~> 3.5) 185 | jekyll-seo-tag (~> 2.0) 186 | jekyll-titles-from-headings (0.5.1) 187 | jekyll (~> 3.3) 188 | jekyll-watch (2.1.2) 189 | listen (~> 3.0) 190 | jemoji (0.10.1) 191 | gemoji (~> 3.0) 192 | html-pipeline (~> 2.2) 193 | jekyll (~> 3.0) 194 | kramdown (1.17.0) 195 | liquid (4.0.0) 196 | listen (3.1.5) 197 | rb-fsevent (~> 0.9, >= 0.9.4) 198 | rb-inotify (~> 0.9, >= 0.9.7) 199 | ruby_dep (~> 1.2) 200 | mercenary (0.3.6) 201 | mini_portile2 (2.3.0) 202 | minima (2.5.0) 203 | jekyll (~> 3.5) 204 | jekyll-feed (~> 0.9) 205 | jekyll-seo-tag (~> 2.1) 206 | minitest (5.11.3) 207 | multipart-post (2.0.0) 208 | nokogiri (1.8.5) 209 | mini_portile2 (~> 2.3.0) 210 | octokit (4.13.0) 211 | sawyer (~> 0.8.0, >= 0.5.3) 212 | pathutil (0.16.2) 213 | forwardable-extended (~> 2.6) 214 | public_suffix (2.0.5) 215 | rb-fsevent (0.10.3) 216 | rb-inotify (0.9.10) 217 | ffi (>= 0.5.0, < 2) 218 | rouge (2.2.1) 219 | ruby-enum (0.7.2) 220 | i18n 221 | ruby_dep (1.5.0) 222 | rubyzip (1.2.2) 223 | safe_yaml (1.0.4) 224 | sass (3.7.2) 225 | sass-listen (~> 4.0.0) 226 | sass-listen (4.0.0) 227 | rb-fsevent (~> 0.9, >= 0.9.4) 228 | rb-inotify (~> 0.9, >= 0.9.7) 229 | sawyer (0.8.1) 230 | addressable (>= 2.3.5, < 2.6) 231 | faraday (~> 0.8, < 1.0) 232 | terminal-table (1.8.0) 233 | unicode-display_width (~> 1.1, >= 1.1.1) 234 | thread_safe (0.3.6) 235 | typhoeus (1.3.1) 236 | ethon (>= 0.9.0) 237 | tzinfo (1.2.5) 238 | thread_safe (~> 0.1) 239 | unicode-display_width (1.4.0) 240 | 241 | PLATFORMS 242 | ruby 243 | 244 | DEPENDENCIES 245 | github-pages 246 | 247 | BUNDLED WITH 248 | 1.17.1 249 | -------------------------------------------------------------------------------- /docs/_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-minimal 2 | 3 | title: Overcast for Mac (unofficial) 4 | description: An unofficial macOS desktop application for Overcast. 5 | 6 | google_analytics: UA-41066869-1 7 | show_downloads: false 8 | 9 | download: https://github.com/nathanbirrell/overcast-macos/releases/latest 10 | version: v0.2.2 11 | 12 | github: 13 | user: nathanbirrell 14 | repo: overcast-macos 15 | -------------------------------------------------------------------------------- /docs/_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ site.title | default: site.github.repository_name }} 7 | 8 | 9 | 10 | 13 | 14 | 15 | 16 | 17 |
18 |
19 |

{{ site.title | default: site.github.repository_name }}

20 |

{{ site.description | default: site.github.project_tagline }}

21 | 22 | {% if site.download %} 23 |

Download Overcast for Mac ({{site.version}})

24 | {% endif %} 25 | 26 | {% if site.github.is_project_page %} 27 |

View on GitHub {{ site.github_name }}

28 | 29 | {% endif %} 30 | 31 | {% if site.github.is_user_page %} 32 |

View My GitHub Profile

33 | {% endif %} 34 | 35 | {% if site.show_downloads %} 36 | 41 | {% endif %} 42 |
43 |
44 | 45 | {{ content }} 46 | 47 |
48 | 54 |
55 | 56 | 57 | 58 | {% if site.google_analytics %} 59 | 68 | {% endif %} 69 | 70 | 71 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | ![Screenshot of Overcast for Mac in action](https://overcastformac.nathanbirrell.me/screenshot.jpg) 2 | 3 | ## Why? 4 | 5 | * Use your keyboard's media keys (play/pause/skip/prev) 6 | * Alt-tab your way to Overcast, instead of using a browser tab 7 | * Remembers your state, so you can pick up on the shows or eps that you left off 8 | 9 | ## Download 10 | 11 | [Download Latest](https://github.com/nathanbirrell/overcast-macos/releases/latest) 12 | 13 | ## Ideas? 14 | 15 | [Create an issue](https://github.com/nathanbirrell/overcast-macos/issues) 16 | 17 | ## Disclaimer 18 | 19 | This application is in no way affiliated with [Overcast](https://overcast.fm), I use this app a lot on my iPhone and wish I could use it on my Mac too, so I built this. [Get Overcast for iOS here](https://itunes.apple.com/app/overcast-podcast-player/id888422857). 20 | 21 | *Please note: as this is a free application, I have not paid for the $150 Apple Developer Program to sign it. This means you will get an "Unidentified Developer" warning from macOS's Gatekeeper. [Go here to open the app regardless](https://support.apple.com/kb/PH25088?locale=en_US)* 22 | -------------------------------------------------------------------------------- /docs/screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathanbirrell/overcast-macos/0dcc9700bcdfee4bf17314c3ab0cce3594360a83/docs/screenshot.jpg -------------------------------------------------------------------------------- /docs/theme.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 | Text can be **bold**, _italic_, or ~~strikethrough~~. 6 | 7 | [Link to another page](another-page). 8 | 9 | There should be whitespace between paragraphs. 10 | 11 | There should be whitespace between paragraphs. We recommend including a README, or a file with information about your project. 12 | 13 | # [](#header-1)Header 1 14 | 15 | This is a normal paragraph following a header. GitHub is a code hosting platform for version control and collaboration. It lets you and others work together on projects from anywhere. 16 | 17 | ## [](#header-2)Header 2 18 | 19 | > This is a blockquote following a header. 20 | > 21 | > When something is important enough, you do it even if the odds are not in your favor. 22 | 23 | ### [](#header-3)Header 3 24 | 25 | ```js 26 | // Javascript code with syntax highlighting. 27 | var fun = function lang(l) { 28 | dateformat.i18n = require('./lang/' + l) 29 | return true; 30 | } 31 | ``` 32 | 33 | ```ruby 34 | # Ruby code with syntax highlighting 35 | GitHubPages::Dependencies.gems.each do |gem, version| 36 | s.add_dependency(gem, "= #{version}") 37 | end 38 | ``` 39 | 40 | #### [](#header-4)Header 4 41 | 42 | * This is an unordered list following a header. 43 | * This is an unordered list following a header. 44 | * This is an unordered list following a header. 45 | 46 | ##### [](#header-5)Header 5 47 | 48 | 1. This is an ordered list following a header. 49 | 2. This is an ordered list following a header. 50 | 3. This is an ordered list following a header. 51 | 52 | ###### [](#header-6)Header 6 53 | 54 | | head1 | head two | three | 55 | |:-------------|:------------------|:------| 56 | | ok | good swedish fish | nice | 57 | | out of stock | good and plenty | nice | 58 | | ok | good `oreos` | hmm | 59 | | ok | good `zoute` drop | yumm | 60 | 61 | ### There's a horizontal rule below this. 62 | 63 | * * * 64 | 65 | ### Here is an unordered list: 66 | 67 | * Item foo 68 | * Item bar 69 | * Item baz 70 | * Item zip 71 | 72 | ### And an ordered list: 73 | 74 | 1. Item one 75 | 1. Item two 76 | 1. Item three 77 | 1. Item four 78 | 79 | ### And a nested list: 80 | 81 | - level 1 item 82 | - level 2 item 83 | - level 2 item 84 | - level 3 item 85 | - level 3 item 86 | - level 1 item 87 | - level 2 item 88 | - level 2 item 89 | - level 2 item 90 | - level 1 item 91 | - level 2 item 92 | - level 2 item 93 | - level 1 item 94 | 95 | ### Small image 96 | 97 | ![](https://assets-cdn.github.com/images/icons/emoji/octocat.png) 98 | 99 | ### Large image 100 | 101 | ![](https://guides.github.com/activities/hello-world/branching.png) 102 | 103 | 104 | ### Definition lists can be used with HTML syntax. 105 | 106 |
107 |
Name
108 |
Godzilla
109 |
Born
110 |
1952
111 |
Birthplace
112 |
Japan
113 |
Color
114 |
Green
115 |
116 | 117 | ``` 118 | Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this. 119 | ``` 120 | 121 | ``` 122 | The final element. 123 | ``` 124 | -------------------------------------------------------------------------------- /global_shortcuts.js: -------------------------------------------------------------------------------- 1 | const { globalShortcut } = require('electron') 2 | const Config = require('electron-config') 3 | const config = new Config() 4 | 5 | toggleMediaKeySettings = (window) => { 6 | let currentlyOn = config.get('mediaKeysOn') 7 | if (currentlyOn) { 8 | config.set('mediaKeysOn', false) 9 | unregisterGlobalShortcuts() 10 | } else { 11 | config.set('mediaKeysOn', true) 12 | registerGlobalShortcuts(window) 13 | } 14 | } 15 | 16 | registerGlobalShortcuts = (mainWindow) => { 17 | if (!config.get('mediaKeysOn')) { 18 | return false; 19 | } 20 | // Global keyboard shortcuts 21 | globalShortcut.register('MediaPlayPause', () => { 22 | mainWindow.webContents.send('playback', 'playpause') 23 | }) 24 | globalShortcut.register('MediaNextTrack', () => { 25 | mainWindow.webContents.send('playback', 'next') 26 | }) 27 | globalShortcut.register('MediaPreviousTrack', () => { 28 | mainWindow.webContents.send('playback', 'previous') 29 | }) 30 | } 31 | 32 | unregisterGlobalShortcuts = () => { 33 | globalShortcut.unregister('MediaPlayPause') 34 | globalShortcut.unregister('MediaNextTrack') 35 | globalShortcut.unregister('MediaPreviousTrack') 36 | } 37 | 38 | exports.toggleMediaKeySettings = toggleMediaKeySettings 39 | exports.registerGlobalShortcuts = registerGlobalShortcuts 40 | -------------------------------------------------------------------------------- /icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nathanbirrell/overcast-macos/0dcc9700bcdfee4bf17314c3ab0cce3594360a83/icon.icns -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Overcast 6 | 7 | 8 | 9 | 10 |
11 | 12 |
13 | 14 | 15 | 16 | 20 | 21 | -------------------------------------------------------------------------------- /loader.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 25 | 26 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | const electron = require('electron') 2 | const Config = require('electron-config') 3 | 4 | const globalShortcuts = require('./global_shortcuts.js') 5 | 6 | // Module to control application life. 7 | const app = electron.app 8 | // Module to create native browser window. 9 | const BrowserWindow = electron.BrowserWindow 10 | 11 | // Allows communication between the main process and the render process 12 | const ipcMain = electron.ipcMain 13 | 14 | const config = new Config() 15 | 16 | const path = require('path') 17 | const url = require('url') 18 | 19 | const defaultUrl = 'https://overcast.fm/podcasts' 20 | 21 | let currentUri = config.get('currentUri') 22 | 23 | // Set some config if it isn't set already 24 | 25 | // Set current URL as default if not set 26 | if (!currentUri || currentUri === '') { 27 | currentUri = defaultUrl; 28 | config.set('currentUri', currentUri) 29 | } 30 | 31 | if (config.get('mediaKeysOn') === undefined) { 32 | config.set('mediaKeysOn', true) 33 | } 34 | 35 | // Keep a global reference of the window object, if you don't, the window will 36 | // be closed automatically when the JavaScript object is garbage collected. 37 | let mainWindow 38 | 39 | function createWindow () { 40 | let options = { 41 | width: 430, 42 | height: 660, 43 | transparent: false, 44 | titleBarStyle: 'hidden-inset', 45 | frame: false 46 | } 47 | 48 | Object.assign(options, config.get('winBounds')) 49 | 50 | // Create the browser window. 51 | mainWindow = new BrowserWindow(options) 52 | 53 | // and load the index.html of the app. 54 | mainWindow.loadURL(url.format({ 55 | pathname: path.join(__dirname, 'index.html'), 56 | protocol: 'file:', 57 | slashes: true 58 | })) 59 | 60 | // Open the ools. 61 | // mainWindow.webContents.openDevTools() 62 | 63 | // Emitted when the window is closed. 64 | mainWindow.on('close', function () { 65 | config.set('winBounds', mainWindow.getBounds()) 66 | config.set('currentUri', currentUri) 67 | }) 68 | 69 | mainWindow.on('closed', function () { 70 | // Dereference the window object, usually you would store windows 71 | // in an array if your app supports multi windows, this is the time 72 | // when you should delete the corresponding element. 73 | mainWindow = null 74 | }) 75 | 76 | globalShortcuts.registerGlobalShortcuts(mainWindow) 77 | } 78 | 79 | exports.getCurrentUri = () => { 80 | return currentUri; 81 | } 82 | 83 | exports.setCurrentUri = (uri) => { 84 | currentUri = uri; 85 | } 86 | 87 | // This method will be called when Electron has finished 88 | // initialization and is ready to create browser windows. 89 | // Some APIs can only be used after this event occurs. 90 | app.on('ready', () => { 91 | createWindow() 92 | }) 93 | 94 | // Quit when all windows are closed. 95 | app.on('window-all-closed', function () { 96 | // On OS X it is common for applications and their menu bar 97 | // to stay active until the user quits explicitly with Cmd + Q 98 | if (process.platform !== 'darwin') { 99 | app.quit() 100 | } 101 | }) 102 | 103 | app.on('activate', function () { 104 | // On OS X it's common to re-create a window in the app when the 105 | // dock icon is clicked and there are no other windows open. 106 | if (mainWindow === null) { 107 | createWindow() 108 | } 109 | }) 110 | 111 | // In this file you can include the rest of your app's specific main process 112 | // code. You can also put them in separate files and require them here. 113 | 114 | require('./menu') 115 | -------------------------------------------------------------------------------- /menu.js: -------------------------------------------------------------------------------- 1 | const electron = require('electron') 2 | const BrowserWindow = electron.BrowserWindow 3 | const Menu = electron.Menu 4 | const app = electron.app 5 | 6 | const Config = require('electron-config') 7 | const config = new Config() 8 | 9 | const globalShortcuts = require('./global_shortcuts.js') 10 | 11 | let template = [{ 12 | label: 'Edit', 13 | submenu: [{ 14 | label: 'Undo', 15 | accelerator: 'CmdOrCtrl+Z', 16 | role: 'undo' 17 | }, { 18 | label: 'Redo', 19 | accelerator: 'Shift+CmdOrCtrl+Z', 20 | role: 'redo' 21 | }, { 22 | type: 'separator' 23 | }, { 24 | label: 'Cut', 25 | accelerator: 'CmdOrCtrl+X', 26 | role: 'cut' 27 | }, { 28 | label: 'Copy', 29 | accelerator: 'CmdOrCtrl+C', 30 | role: 'copy' 31 | }, { 32 | label: 'Paste', 33 | accelerator: 'CmdOrCtrl+V', 34 | role: 'paste' 35 | }, { 36 | label: 'Select All', 37 | accelerator: 'CmdOrCtrl+A', 38 | role: 'selectall' 39 | }] 40 | }, { 41 | label: 'View', 42 | submenu: [{ 43 | label: 'Reload', 44 | accelerator: 'CmdOrCtrl+R', 45 | click: function (item, focusedWindow) { 46 | if (focusedWindow) { 47 | // on reload, start fresh and close any old 48 | // open secondary windows 49 | if (focusedWindow.id === 1) { 50 | BrowserWindow.getAllWindows().forEach(function (win) { 51 | if (win.id > 1) { 52 | win.close() 53 | } 54 | }) 55 | } 56 | focusedWindow.reload() 57 | } 58 | } 59 | }, { 60 | label: 'Toggle Full Screen', 61 | accelerator: (function () { 62 | if (process.platform === 'darwin') { 63 | return 'Ctrl+Command+F' 64 | } else { 65 | return 'F11' 66 | } 67 | })(), 68 | click: function (item, focusedWindow) { 69 | if (focusedWindow) { 70 | focusedWindow.setFullScreen(!focusedWindow.isFullScreen()) 71 | } 72 | } 73 | }, { 74 | label: 'Toggle Developer Tools', 75 | accelerator: (function () { 76 | if (process.platform === 'darwin') { 77 | return 'Alt+Command+I' 78 | } else { 79 | return 'Ctrl+Shift+I' 80 | } 81 | })(), 82 | click: function (item, focusedWindow) { 83 | if (focusedWindow) { 84 | focusedWindow.toggleDevTools() 85 | } 86 | } 87 | }, { 88 | label: 'Go Back', 89 | accelerator: (function () { 90 | if (process.platform === 'darwin') { 91 | return 'Command+[' 92 | } else { 93 | return 'Ctrl+[' 94 | } 95 | })(), 96 | click: function (item, focusedWindow) { 97 | if (focusedWindow) { 98 | focusedWindow.webContents.send('navigate', 'back') 99 | } 100 | } 101 | }, { 102 | label: 'Go Forward', 103 | accelerator: (function () { 104 | if (process.platform === 'darwin') { 105 | return 'Command+]' 106 | } else { 107 | return 'Ctrl+]' 108 | } 109 | })(), 110 | click: function (item, focusedWindow) { 111 | if (focusedWindow) { 112 | focusedWindow.webContents.send('navigate', 'forward') 113 | } 114 | } 115 | }] 116 | }, { 117 | label: 'Playback', 118 | role: 'window', 119 | submenu: [{ 120 | label: 'Play/Pause', 121 | accelerator: 'MediaPlayPause', 122 | click: function (item, focusedWindow) { 123 | if (focusedWindow) { 124 | focusedWindow.webContents.send('playback', 'playpause') 125 | } 126 | } 127 | }, { 128 | label: 'Skip forward', 129 | accelerator: 'MediaNextTrack', 130 | click: function (item, focusedWindow) { 131 | if (focusedWindow) { 132 | focusedWindow.webContents.send('playback', 'next') 133 | } 134 | } 135 | }, { 136 | label: 'Skip back', 137 | accelerator: 'MediaPreviousTrack', 138 | click: function (item, focusedWindow) { 139 | if (focusedWindow) { 140 | focusedWindow.webContents.send('playback', 'previous') 141 | } 142 | } 143 | }, { 144 | type: 'separator' 145 | }, { 146 | label: 'Control Overcast with media keys', 147 | type: 'checkbox', 148 | checked: config.get('mediaKeysOn'), 149 | click: (item, focusedWindow) => { 150 | globalShortcuts.toggleMediaKeySettings(focusedWindow); 151 | } 152 | }] 153 | }, { 154 | label: 'Window', 155 | role: 'window', 156 | submenu: [{ 157 | label: 'Minimize', 158 | accelerator: 'CmdOrCtrl+M', 159 | role: 'minimize' 160 | }, { 161 | label: 'Close', 162 | accelerator: 'CmdOrCtrl+W', 163 | role: 'close' 164 | }, { 165 | type: 'separator' 166 | }, { 167 | label: 'Reopen Window', 168 | accelerator: 'CmdOrCtrl+Shift+T', 169 | enabled: false, 170 | key: 'reopenMenuItem', 171 | click: function () { 172 | app.emit('activate') 173 | } 174 | }] 175 | }, { 176 | label: 'Help', 177 | role: 'help', 178 | submenu: [{ 179 | label: 'Learn More', 180 | click: function () { 181 | electron.shell.openExternal('http://overcastformac.nathanbirrell.me') 182 | } 183 | }] 184 | }] 185 | 186 | function addUpdateMenuItems (items, position) { 187 | if (process.mas) return 188 | 189 | const version = electron.app.getVersion() 190 | let updateItems = [{ 191 | label: `Version ${version}`, 192 | enabled: false 193 | }, { 194 | label: 'Checking for Update', 195 | enabled: false, 196 | key: 'checkingForUpdate' 197 | }, { 198 | label: 'Check for Update', 199 | visible: false, 200 | key: 'checkForUpdate', 201 | click: function () { 202 | require('electron').autoUpdater.checkForUpdates() 203 | } 204 | }, { 205 | label: 'Restart and Install Update', 206 | enabled: true, 207 | visible: false, 208 | key: 'restartToUpdate', 209 | click: function () { 210 | require('electron').autoUpdater.quitAndInstall() 211 | } 212 | }] 213 | 214 | items.splice.apply(items, [position, 0].concat(updateItems)) 215 | } 216 | 217 | function findReopenMenuItem () { 218 | const menu = Menu.getApplicationMenu() 219 | if (!menu) return 220 | 221 | let reopenMenuItem 222 | menu.items.forEach(function (item) { 223 | if (item.submenu) { 224 | item.submenu.items.forEach(function (item) { 225 | if (item.key === 'reopenMenuItem') { 226 | reopenMenuItem = item 227 | } 228 | }) 229 | } 230 | }) 231 | return reopenMenuItem 232 | } 233 | 234 | if (process.platform === 'darwin') { 235 | const name = electron.app.getName() 236 | template.unshift({ 237 | label: name, 238 | submenu: [{ 239 | label: `About ${name}`, 240 | role: 'about' 241 | }, { 242 | type: 'separator' 243 | }, { 244 | label: 'Services', 245 | role: 'services', 246 | submenu: [] 247 | }, { 248 | type: 'separator' 249 | }, { 250 | label: `Hide ${name}`, 251 | accelerator: 'Command+H', 252 | role: 'hide' 253 | }, { 254 | label: 'Hide Others', 255 | accelerator: 'Command+Alt+H', 256 | role: 'hideothers' 257 | }, { 258 | label: 'Show All', 259 | role: 'unhide' 260 | }, { 261 | type: 'separator' 262 | }, { 263 | label: 'Quit', 264 | accelerator: 'Command+Q', 265 | click: function () { 266 | app.quit() 267 | } 268 | }] 269 | }) 270 | 271 | // Window menu. 272 | template[4].submenu.push({ 273 | type: 'separator' 274 | }, { 275 | label: 'Bring All to Front', 276 | role: 'front' 277 | }) 278 | 279 | addUpdateMenuItems(template[0].submenu, 1) 280 | } 281 | 282 | if (process.platform === 'win32') { 283 | const helpMenu = template[template.length - 1].submenu 284 | addUpdateMenuItems(helpMenu, 0) 285 | } 286 | 287 | app.on('ready', function () { 288 | const menu = Menu.buildFromTemplate(template) 289 | Menu.setApplicationMenu(menu) 290 | }) 291 | 292 | app.on('browser-window-created', function () { 293 | let reopenMenuItem = findReopenMenuItem() 294 | if (reopenMenuItem) reopenMenuItem.enabled = false 295 | }) 296 | 297 | app.on('window-all-closed', function () { 298 | let reopenMenuItem = findReopenMenuItem() 299 | if (reopenMenuItem) reopenMenuItem.enabled = true 300 | }) 301 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "overcast-macos", 3 | "version": "0.2.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/node": { 8 | "version": "8.10.38", 9 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.38.tgz", 10 | "integrity": "sha512-EibsnbJerd0hBFaDjJStFrVbVBAtOy4dgL8zZFw0uOvPqzBAX59Ci8cgjg3+RgJIWhsB5A4c+pi+D4P9tQQh/A==" 11 | }, 12 | "ajv": { 13 | "version": "6.5.5", 14 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", 15 | "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", 16 | "requires": { 17 | "fast-deep-equal": "^2.0.1", 18 | "fast-json-stable-stringify": "^2.0.0", 19 | "json-schema-traverse": "^0.4.1", 20 | "uri-js": "^4.2.2" 21 | } 22 | }, 23 | "ansi-regex": { 24 | "version": "2.1.1", 25 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 26 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 27 | }, 28 | "array-find-index": { 29 | "version": "1.0.2", 30 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 31 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" 32 | }, 33 | "asn1": { 34 | "version": "0.2.4", 35 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 36 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 37 | "requires": { 38 | "safer-buffer": "~2.1.0" 39 | } 40 | }, 41 | "assert-plus": { 42 | "version": "1.0.0", 43 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 44 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 45 | }, 46 | "asynckit": { 47 | "version": "0.4.0", 48 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 49 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 50 | }, 51 | "aws-sign2": { 52 | "version": "0.7.0", 53 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 54 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 55 | }, 56 | "aws4": { 57 | "version": "1.8.0", 58 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 59 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 60 | }, 61 | "bcrypt-pbkdf": { 62 | "version": "1.0.2", 63 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 64 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 65 | "requires": { 66 | "tweetnacl": "^0.14.3" 67 | } 68 | }, 69 | "buffer-from": { 70 | "version": "1.1.1", 71 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 72 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 73 | }, 74 | "builtin-modules": { 75 | "version": "1.1.1", 76 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 77 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" 78 | }, 79 | "camelcase": { 80 | "version": "2.1.1", 81 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 82 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 83 | }, 84 | "camelcase-keys": { 85 | "version": "2.1.0", 86 | "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", 87 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", 88 | "requires": { 89 | "camelcase": "^2.0.0", 90 | "map-obj": "^1.0.0" 91 | } 92 | }, 93 | "caseless": { 94 | "version": "0.12.0", 95 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 96 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 97 | }, 98 | "code-point-at": { 99 | "version": "1.1.0", 100 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 101 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 102 | }, 103 | "combined-stream": { 104 | "version": "1.0.7", 105 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 106 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 107 | "requires": { 108 | "delayed-stream": "~1.0.0" 109 | } 110 | }, 111 | "concat-stream": { 112 | "version": "1.6.2", 113 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 114 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 115 | "requires": { 116 | "buffer-from": "^1.0.0", 117 | "inherits": "^2.0.3", 118 | "readable-stream": "^2.2.2", 119 | "typedarray": "^0.0.6" 120 | }, 121 | "dependencies": { 122 | "isarray": { 123 | "version": "1.0.0", 124 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 125 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 126 | }, 127 | "readable-stream": { 128 | "version": "2.3.6", 129 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 130 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 131 | "requires": { 132 | "core-util-is": "~1.0.0", 133 | "inherits": "~2.0.3", 134 | "isarray": "~1.0.0", 135 | "process-nextick-args": "~2.0.0", 136 | "safe-buffer": "~5.1.1", 137 | "string_decoder": "~1.1.1", 138 | "util-deprecate": "~1.0.1" 139 | } 140 | }, 141 | "string_decoder": { 142 | "version": "1.1.1", 143 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 144 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 145 | "requires": { 146 | "safe-buffer": "~5.1.0" 147 | } 148 | } 149 | } 150 | }, 151 | "conf": { 152 | "version": "0.11.2", 153 | "resolved": "http://registry.npmjs.org/conf/-/conf-0.11.2.tgz", 154 | "integrity": "sha1-h59HkmdgBIPlAlg0YspAY/yXebI=", 155 | "requires": { 156 | "dot-prop": "^3.0.0", 157 | "env-paths": "^0.3.0", 158 | "mkdirp": "^0.5.1", 159 | "pkg-up": "^1.0.0" 160 | } 161 | }, 162 | "core-util-is": { 163 | "version": "1.0.2", 164 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 165 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 166 | }, 167 | "currently-unhandled": { 168 | "version": "0.4.1", 169 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 170 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 171 | "requires": { 172 | "array-find-index": "^1.0.1" 173 | } 174 | }, 175 | "dashdash": { 176 | "version": "1.14.1", 177 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 178 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 179 | "requires": { 180 | "assert-plus": "^1.0.0" 181 | } 182 | }, 183 | "debug": { 184 | "version": "3.2.6", 185 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 186 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 187 | "requires": { 188 | "ms": "^2.1.1" 189 | } 190 | }, 191 | "decamelize": { 192 | "version": "1.2.0", 193 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 194 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 195 | }, 196 | "deep-extend": { 197 | "version": "0.6.0", 198 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 199 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 200 | }, 201 | "delayed-stream": { 202 | "version": "1.0.0", 203 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 204 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 205 | }, 206 | "dot-prop": { 207 | "version": "3.0.0", 208 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", 209 | "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", 210 | "requires": { 211 | "is-obj": "^1.0.0" 212 | } 213 | }, 214 | "ecc-jsbn": { 215 | "version": "0.1.2", 216 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 217 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 218 | "requires": { 219 | "jsbn": "~0.1.0", 220 | "safer-buffer": "^2.1.0" 221 | } 222 | }, 223 | "electron": { 224 | "version": "3.0.9", 225 | "resolved": "https://registry.npmjs.org/electron/-/electron-3.0.9.tgz", 226 | "integrity": "sha512-OoSoeUWo9PzbArgrwS1yTfTRSlpXmIgrFGWUuUZCjKAk4DGR70elHDNeRnnBJ9NTwXXZVifChcfx73Ah3GnlVQ==", 227 | "requires": { 228 | "@types/node": "^8.0.24", 229 | "electron-download": "^4.1.0", 230 | "extract-zip": "^1.0.3" 231 | } 232 | }, 233 | "electron-config": { 234 | "version": "0.2.1", 235 | "resolved": "http://registry.npmjs.org/electron-config/-/electron-config-0.2.1.tgz", 236 | "integrity": "sha1-fhLCZBLQa/PtOJbQR53xYphrlbo=", 237 | "requires": { 238 | "conf": "^0.11.1" 239 | } 240 | }, 241 | "electron-context-menu": { 242 | "version": "0.8.0", 243 | "resolved": "http://registry.npmjs.org/electron-context-menu/-/electron-context-menu-0.8.0.tgz", 244 | "integrity": "sha1-YMS14p1VFAB76HKKbr3zy2lMTj4=", 245 | "requires": { 246 | "electron-dl": "^1.2.0", 247 | "electron-is-dev": "^0.1.1" 248 | } 249 | }, 250 | "electron-dl": { 251 | "version": "1.12.0", 252 | "resolved": "https://registry.npmjs.org/electron-dl/-/electron-dl-1.12.0.tgz", 253 | "integrity": "sha512-UMc2CL45Ybpvu66LDPYzwmDRmYK4Ivz+wdnTM0eXcNMztvQwhixAk2UPme1c7McqG8bAlKEkQpZn3epmQy4EWg==", 254 | "requires": { 255 | "ext-name": "^5.0.0", 256 | "pupa": "^1.0.0", 257 | "unused-filename": "^1.0.0" 258 | } 259 | }, 260 | "electron-download": { 261 | "version": "4.1.1", 262 | "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", 263 | "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==", 264 | "requires": { 265 | "debug": "^3.0.0", 266 | "env-paths": "^1.0.0", 267 | "fs-extra": "^4.0.1", 268 | "minimist": "^1.2.0", 269 | "nugget": "^2.0.1", 270 | "path-exists": "^3.0.0", 271 | "rc": "^1.2.1", 272 | "semver": "^5.4.1", 273 | "sumchecker": "^2.0.2" 274 | }, 275 | "dependencies": { 276 | "env-paths": { 277 | "version": "1.0.0", 278 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", 279 | "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=" 280 | }, 281 | "path-exists": { 282 | "version": "3.0.0", 283 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 284 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 285 | } 286 | } 287 | }, 288 | "electron-is-dev": { 289 | "version": "0.1.2", 290 | "resolved": "http://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.1.2.tgz", 291 | "integrity": "sha1-ihBD4ys6HaHD9VPc4oznZCRhZ+M=" 292 | }, 293 | "env-paths": { 294 | "version": "0.3.1", 295 | "resolved": "http://registry.npmjs.org/env-paths/-/env-paths-0.3.1.tgz", 296 | "integrity": "sha1-wwzPy8MMiQlD3AioVYJRfvANpGM=" 297 | }, 298 | "error-ex": { 299 | "version": "1.3.2", 300 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 301 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 302 | "requires": { 303 | "is-arrayish": "^0.2.1" 304 | } 305 | }, 306 | "ext-list": { 307 | "version": "2.2.2", 308 | "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", 309 | "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", 310 | "requires": { 311 | "mime-db": "^1.28.0" 312 | } 313 | }, 314 | "ext-name": { 315 | "version": "5.0.0", 316 | "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", 317 | "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", 318 | "requires": { 319 | "ext-list": "^2.0.0", 320 | "sort-keys-length": "^1.0.0" 321 | } 322 | }, 323 | "extend": { 324 | "version": "3.0.2", 325 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 326 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 327 | }, 328 | "extract-zip": { 329 | "version": "1.6.7", 330 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", 331 | "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", 332 | "requires": { 333 | "concat-stream": "1.6.2", 334 | "debug": "2.6.9", 335 | "mkdirp": "0.5.1", 336 | "yauzl": "2.4.1" 337 | }, 338 | "dependencies": { 339 | "debug": { 340 | "version": "2.6.9", 341 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 342 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 343 | "requires": { 344 | "ms": "2.0.0" 345 | } 346 | }, 347 | "ms": { 348 | "version": "2.0.0", 349 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 350 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 351 | } 352 | } 353 | }, 354 | "extsprintf": { 355 | "version": "1.3.0", 356 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 357 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 358 | }, 359 | "fast-deep-equal": { 360 | "version": "2.0.1", 361 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 362 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 363 | }, 364 | "fast-json-stable-stringify": { 365 | "version": "2.0.0", 366 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 367 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 368 | }, 369 | "fd-slicer": { 370 | "version": "1.0.1", 371 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", 372 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 373 | "requires": { 374 | "pend": "~1.2.0" 375 | } 376 | }, 377 | "find-up": { 378 | "version": "1.1.2", 379 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 380 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 381 | "requires": { 382 | "path-exists": "^2.0.0", 383 | "pinkie-promise": "^2.0.0" 384 | } 385 | }, 386 | "forever-agent": { 387 | "version": "0.6.1", 388 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 389 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 390 | }, 391 | "form-data": { 392 | "version": "2.3.3", 393 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 394 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 395 | "requires": { 396 | "asynckit": "^0.4.0", 397 | "combined-stream": "^1.0.6", 398 | "mime-types": "^2.1.12" 399 | } 400 | }, 401 | "fs-extra": { 402 | "version": "4.0.3", 403 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", 404 | "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", 405 | "requires": { 406 | "graceful-fs": "^4.1.2", 407 | "jsonfile": "^4.0.0", 408 | "universalify": "^0.1.0" 409 | } 410 | }, 411 | "get-stdin": { 412 | "version": "4.0.1", 413 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 414 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" 415 | }, 416 | "getpass": { 417 | "version": "0.1.7", 418 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 419 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 420 | "requires": { 421 | "assert-plus": "^1.0.0" 422 | } 423 | }, 424 | "graceful-fs": { 425 | "version": "4.1.15", 426 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 427 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 428 | }, 429 | "har-schema": { 430 | "version": "2.0.0", 431 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 432 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 433 | }, 434 | "har-validator": { 435 | "version": "5.1.3", 436 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 437 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 438 | "requires": { 439 | "ajv": "^6.5.5", 440 | "har-schema": "^2.0.0" 441 | } 442 | }, 443 | "hosted-git-info": { 444 | "version": "2.7.1", 445 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", 446 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" 447 | }, 448 | "http-signature": { 449 | "version": "1.2.0", 450 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 451 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 452 | "requires": { 453 | "assert-plus": "^1.0.0", 454 | "jsprim": "^1.2.2", 455 | "sshpk": "^1.7.0" 456 | } 457 | }, 458 | "indent-string": { 459 | "version": "2.1.0", 460 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 461 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", 462 | "requires": { 463 | "repeating": "^2.0.0" 464 | } 465 | }, 466 | "inherits": { 467 | "version": "2.0.3", 468 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 469 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 470 | }, 471 | "ini": { 472 | "version": "1.3.5", 473 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 474 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 475 | }, 476 | "is-arrayish": { 477 | "version": "0.2.1", 478 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 479 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 480 | }, 481 | "is-builtin-module": { 482 | "version": "1.0.0", 483 | "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 484 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 485 | "requires": { 486 | "builtin-modules": "^1.0.0" 487 | } 488 | }, 489 | "is-finite": { 490 | "version": "1.0.2", 491 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 492 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 493 | "requires": { 494 | "number-is-nan": "^1.0.0" 495 | } 496 | }, 497 | "is-fullwidth-code-point": { 498 | "version": "1.0.0", 499 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 500 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 501 | "requires": { 502 | "number-is-nan": "^1.0.0" 503 | } 504 | }, 505 | "is-obj": { 506 | "version": "1.0.1", 507 | "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 508 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" 509 | }, 510 | "is-plain-obj": { 511 | "version": "1.1.0", 512 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 513 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" 514 | }, 515 | "is-typedarray": { 516 | "version": "1.0.0", 517 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 518 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 519 | }, 520 | "is-utf8": { 521 | "version": "0.2.1", 522 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 523 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 524 | }, 525 | "isarray": { 526 | "version": "0.0.1", 527 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 528 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 529 | }, 530 | "isstream": { 531 | "version": "0.1.2", 532 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 533 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 534 | }, 535 | "jsbn": { 536 | "version": "0.1.1", 537 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 538 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 539 | }, 540 | "json-schema": { 541 | "version": "0.2.3", 542 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 543 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 544 | }, 545 | "json-schema-traverse": { 546 | "version": "0.4.1", 547 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 548 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 549 | }, 550 | "json-stringify-safe": { 551 | "version": "5.0.1", 552 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 553 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 554 | }, 555 | "jsonfile": { 556 | "version": "4.0.0", 557 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 558 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 559 | "requires": { 560 | "graceful-fs": "^4.1.6" 561 | } 562 | }, 563 | "jsprim": { 564 | "version": "1.4.1", 565 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 566 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 567 | "requires": { 568 | "assert-plus": "1.0.0", 569 | "extsprintf": "1.3.0", 570 | "json-schema": "0.2.3", 571 | "verror": "1.10.0" 572 | } 573 | }, 574 | "load-json-file": { 575 | "version": "1.1.0", 576 | "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 577 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 578 | "requires": { 579 | "graceful-fs": "^4.1.2", 580 | "parse-json": "^2.2.0", 581 | "pify": "^2.0.0", 582 | "pinkie-promise": "^2.0.0", 583 | "strip-bom": "^2.0.0" 584 | } 585 | }, 586 | "loud-rejection": { 587 | "version": "1.6.0", 588 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 589 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 590 | "requires": { 591 | "currently-unhandled": "^0.4.1", 592 | "signal-exit": "^3.0.0" 593 | } 594 | }, 595 | "map-obj": { 596 | "version": "1.0.1", 597 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 598 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" 599 | }, 600 | "meow": { 601 | "version": "3.7.0", 602 | "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", 603 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", 604 | "requires": { 605 | "camelcase-keys": "^2.0.0", 606 | "decamelize": "^1.1.2", 607 | "loud-rejection": "^1.0.0", 608 | "map-obj": "^1.0.1", 609 | "minimist": "^1.1.3", 610 | "normalize-package-data": "^2.3.4", 611 | "object-assign": "^4.0.1", 612 | "read-pkg-up": "^1.0.1", 613 | "redent": "^1.0.0", 614 | "trim-newlines": "^1.0.0" 615 | } 616 | }, 617 | "mime-db": { 618 | "version": "1.37.0", 619 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 620 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 621 | }, 622 | "mime-types": { 623 | "version": "2.1.21", 624 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 625 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 626 | "requires": { 627 | "mime-db": "~1.37.0" 628 | } 629 | }, 630 | "minimist": { 631 | "version": "1.2.0", 632 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 633 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 634 | }, 635 | "mkdirp": { 636 | "version": "0.5.1", 637 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 638 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 639 | "requires": { 640 | "minimist": "0.0.8" 641 | }, 642 | "dependencies": { 643 | "minimist": { 644 | "version": "0.0.8", 645 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 646 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 647 | } 648 | } 649 | }, 650 | "modify-filename": { 651 | "version": "1.1.0", 652 | "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", 653 | "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=" 654 | }, 655 | "ms": { 656 | "version": "2.1.1", 657 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 658 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 659 | }, 660 | "normalize-package-data": { 661 | "version": "2.4.0", 662 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 663 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 664 | "requires": { 665 | "hosted-git-info": "^2.1.4", 666 | "is-builtin-module": "^1.0.0", 667 | "semver": "2 || 3 || 4 || 5", 668 | "validate-npm-package-license": "^3.0.1" 669 | } 670 | }, 671 | "nugget": { 672 | "version": "2.0.1", 673 | "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", 674 | "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", 675 | "requires": { 676 | "debug": "^2.1.3", 677 | "minimist": "^1.1.0", 678 | "pretty-bytes": "^1.0.2", 679 | "progress-stream": "^1.1.0", 680 | "request": "^2.45.0", 681 | "single-line-log": "^1.1.2", 682 | "throttleit": "0.0.2" 683 | }, 684 | "dependencies": { 685 | "debug": { 686 | "version": "2.6.9", 687 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 688 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 689 | "requires": { 690 | "ms": "2.0.0" 691 | } 692 | }, 693 | "ms": { 694 | "version": "2.0.0", 695 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 696 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 697 | } 698 | } 699 | }, 700 | "number-is-nan": { 701 | "version": "1.0.1", 702 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 703 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 704 | }, 705 | "oauth-sign": { 706 | "version": "0.9.0", 707 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 708 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 709 | }, 710 | "object-assign": { 711 | "version": "4.1.1", 712 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 713 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 714 | }, 715 | "object-keys": { 716 | "version": "0.4.0", 717 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", 718 | "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" 719 | }, 720 | "parse-json": { 721 | "version": "2.2.0", 722 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 723 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 724 | "requires": { 725 | "error-ex": "^1.2.0" 726 | } 727 | }, 728 | "path-exists": { 729 | "version": "2.1.0", 730 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 731 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 732 | "requires": { 733 | "pinkie-promise": "^2.0.0" 734 | } 735 | }, 736 | "path-type": { 737 | "version": "1.1.0", 738 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 739 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 740 | "requires": { 741 | "graceful-fs": "^4.1.2", 742 | "pify": "^2.0.0", 743 | "pinkie-promise": "^2.0.0" 744 | } 745 | }, 746 | "pend": { 747 | "version": "1.2.0", 748 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 749 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 750 | }, 751 | "performance-now": { 752 | "version": "2.1.0", 753 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 754 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 755 | }, 756 | "pify": { 757 | "version": "2.3.0", 758 | "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 759 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 760 | }, 761 | "pinkie": { 762 | "version": "2.0.4", 763 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 764 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 765 | }, 766 | "pinkie-promise": { 767 | "version": "2.0.1", 768 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 769 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 770 | "requires": { 771 | "pinkie": "^2.0.0" 772 | } 773 | }, 774 | "pkg-up": { 775 | "version": "1.0.0", 776 | "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", 777 | "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", 778 | "requires": { 779 | "find-up": "^1.0.0" 780 | } 781 | }, 782 | "pretty-bytes": { 783 | "version": "1.0.4", 784 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", 785 | "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", 786 | "requires": { 787 | "get-stdin": "^4.0.1", 788 | "meow": "^3.1.0" 789 | } 790 | }, 791 | "process-nextick-args": { 792 | "version": "2.0.0", 793 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 794 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 795 | }, 796 | "progress-stream": { 797 | "version": "1.2.0", 798 | "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", 799 | "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", 800 | "requires": { 801 | "speedometer": "~0.1.2", 802 | "through2": "~0.2.3" 803 | } 804 | }, 805 | "psl": { 806 | "version": "1.1.29", 807 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", 808 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" 809 | }, 810 | "punycode": { 811 | "version": "2.1.1", 812 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 813 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 814 | }, 815 | "pupa": { 816 | "version": "1.0.0", 817 | "resolved": "https://registry.npmjs.org/pupa/-/pupa-1.0.0.tgz", 818 | "integrity": "sha1-mpVopa9+ZXuEYqbp1TKHQ1YM7/Y=" 819 | }, 820 | "qs": { 821 | "version": "6.5.2", 822 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 823 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 824 | }, 825 | "rc": { 826 | "version": "1.2.8", 827 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 828 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 829 | "requires": { 830 | "deep-extend": "^0.6.0", 831 | "ini": "~1.3.0", 832 | "minimist": "^1.2.0", 833 | "strip-json-comments": "~2.0.1" 834 | } 835 | }, 836 | "read-pkg": { 837 | "version": "1.1.0", 838 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 839 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 840 | "requires": { 841 | "load-json-file": "^1.0.0", 842 | "normalize-package-data": "^2.3.2", 843 | "path-type": "^1.0.0" 844 | } 845 | }, 846 | "read-pkg-up": { 847 | "version": "1.0.1", 848 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 849 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 850 | "requires": { 851 | "find-up": "^1.0.0", 852 | "read-pkg": "^1.0.0" 853 | } 854 | }, 855 | "readable-stream": { 856 | "version": "1.1.14", 857 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 858 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 859 | "requires": { 860 | "core-util-is": "~1.0.0", 861 | "inherits": "~2.0.1", 862 | "isarray": "0.0.1", 863 | "string_decoder": "~0.10.x" 864 | } 865 | }, 866 | "redent": { 867 | "version": "1.0.0", 868 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", 869 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", 870 | "requires": { 871 | "indent-string": "^2.1.0", 872 | "strip-indent": "^1.0.1" 873 | } 874 | }, 875 | "repeating": { 876 | "version": "2.0.1", 877 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 878 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 879 | "requires": { 880 | "is-finite": "^1.0.0" 881 | } 882 | }, 883 | "request": { 884 | "version": "2.88.0", 885 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 886 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 887 | "requires": { 888 | "aws-sign2": "~0.7.0", 889 | "aws4": "^1.8.0", 890 | "caseless": "~0.12.0", 891 | "combined-stream": "~1.0.6", 892 | "extend": "~3.0.2", 893 | "forever-agent": "~0.6.1", 894 | "form-data": "~2.3.2", 895 | "har-validator": "~5.1.0", 896 | "http-signature": "~1.2.0", 897 | "is-typedarray": "~1.0.0", 898 | "isstream": "~0.1.2", 899 | "json-stringify-safe": "~5.0.1", 900 | "mime-types": "~2.1.19", 901 | "oauth-sign": "~0.9.0", 902 | "performance-now": "^2.1.0", 903 | "qs": "~6.5.2", 904 | "safe-buffer": "^5.1.2", 905 | "tough-cookie": "~2.4.3", 906 | "tunnel-agent": "^0.6.0", 907 | "uuid": "^3.3.2" 908 | } 909 | }, 910 | "safe-buffer": { 911 | "version": "5.1.2", 912 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 913 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 914 | }, 915 | "safer-buffer": { 916 | "version": "2.1.2", 917 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 918 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 919 | }, 920 | "semver": { 921 | "version": "5.6.0", 922 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 923 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 924 | }, 925 | "signal-exit": { 926 | "version": "3.0.2", 927 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 928 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 929 | }, 930 | "single-line-log": { 931 | "version": "1.1.2", 932 | "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", 933 | "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", 934 | "requires": { 935 | "string-width": "^1.0.1" 936 | } 937 | }, 938 | "sort-keys": { 939 | "version": "1.1.2", 940 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", 941 | "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", 942 | "requires": { 943 | "is-plain-obj": "^1.0.0" 944 | } 945 | }, 946 | "sort-keys-length": { 947 | "version": "1.0.1", 948 | "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", 949 | "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", 950 | "requires": { 951 | "sort-keys": "^1.0.0" 952 | } 953 | }, 954 | "spdx-correct": { 955 | "version": "3.0.2", 956 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", 957 | "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", 958 | "requires": { 959 | "spdx-expression-parse": "^3.0.0", 960 | "spdx-license-ids": "^3.0.0" 961 | } 962 | }, 963 | "spdx-exceptions": { 964 | "version": "2.2.0", 965 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 966 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" 967 | }, 968 | "spdx-expression-parse": { 969 | "version": "3.0.0", 970 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 971 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 972 | "requires": { 973 | "spdx-exceptions": "^2.1.0", 974 | "spdx-license-ids": "^3.0.0" 975 | } 976 | }, 977 | "spdx-license-ids": { 978 | "version": "3.0.2", 979 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", 980 | "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==" 981 | }, 982 | "speedometer": { 983 | "version": "0.1.4", 984 | "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", 985 | "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=" 986 | }, 987 | "sshpk": { 988 | "version": "1.15.2", 989 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", 990 | "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", 991 | "requires": { 992 | "asn1": "~0.2.3", 993 | "assert-plus": "^1.0.0", 994 | "bcrypt-pbkdf": "^1.0.0", 995 | "dashdash": "^1.12.0", 996 | "ecc-jsbn": "~0.1.1", 997 | "getpass": "^0.1.1", 998 | "jsbn": "~0.1.0", 999 | "safer-buffer": "^2.0.2", 1000 | "tweetnacl": "~0.14.0" 1001 | } 1002 | }, 1003 | "string-width": { 1004 | "version": "1.0.2", 1005 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1006 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1007 | "requires": { 1008 | "code-point-at": "^1.0.0", 1009 | "is-fullwidth-code-point": "^1.0.0", 1010 | "strip-ansi": "^3.0.0" 1011 | } 1012 | }, 1013 | "string_decoder": { 1014 | "version": "0.10.31", 1015 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1016 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 1017 | }, 1018 | "strip-ansi": { 1019 | "version": "3.0.1", 1020 | "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1021 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1022 | "requires": { 1023 | "ansi-regex": "^2.0.0" 1024 | } 1025 | }, 1026 | "strip-bom": { 1027 | "version": "2.0.0", 1028 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 1029 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 1030 | "requires": { 1031 | "is-utf8": "^0.2.0" 1032 | } 1033 | }, 1034 | "strip-indent": { 1035 | "version": "1.0.1", 1036 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", 1037 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", 1038 | "requires": { 1039 | "get-stdin": "^4.0.1" 1040 | } 1041 | }, 1042 | "strip-json-comments": { 1043 | "version": "2.0.1", 1044 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1045 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 1046 | }, 1047 | "sumchecker": { 1048 | "version": "2.0.2", 1049 | "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", 1050 | "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", 1051 | "requires": { 1052 | "debug": "^2.2.0" 1053 | }, 1054 | "dependencies": { 1055 | "debug": { 1056 | "version": "2.6.9", 1057 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1058 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1059 | "requires": { 1060 | "ms": "2.0.0" 1061 | } 1062 | }, 1063 | "ms": { 1064 | "version": "2.0.0", 1065 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1066 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1067 | } 1068 | } 1069 | }, 1070 | "throttleit": { 1071 | "version": "0.0.2", 1072 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", 1073 | "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=" 1074 | }, 1075 | "through2": { 1076 | "version": "0.2.3", 1077 | "resolved": "http://registry.npmjs.org/through2/-/through2-0.2.3.tgz", 1078 | "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", 1079 | "requires": { 1080 | "readable-stream": "~1.1.9", 1081 | "xtend": "~2.1.1" 1082 | } 1083 | }, 1084 | "tough-cookie": { 1085 | "version": "2.4.3", 1086 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 1087 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 1088 | "requires": { 1089 | "psl": "^1.1.24", 1090 | "punycode": "^1.4.1" 1091 | }, 1092 | "dependencies": { 1093 | "punycode": { 1094 | "version": "1.4.1", 1095 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1096 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1097 | } 1098 | } 1099 | }, 1100 | "trim-newlines": { 1101 | "version": "1.0.0", 1102 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", 1103 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" 1104 | }, 1105 | "tunnel-agent": { 1106 | "version": "0.6.0", 1107 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1108 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1109 | "requires": { 1110 | "safe-buffer": "^5.0.1" 1111 | } 1112 | }, 1113 | "tweetnacl": { 1114 | "version": "0.14.5", 1115 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1116 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1117 | }, 1118 | "typedarray": { 1119 | "version": "0.0.6", 1120 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1121 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1122 | }, 1123 | "universalify": { 1124 | "version": "0.1.2", 1125 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1126 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 1127 | }, 1128 | "unused-filename": { 1129 | "version": "1.0.0", 1130 | "resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-1.0.0.tgz", 1131 | "integrity": "sha1-00CID3GuIRXrqhMlvvBcxmhEacY=", 1132 | "requires": { 1133 | "modify-filename": "^1.1.0", 1134 | "path-exists": "^3.0.0" 1135 | }, 1136 | "dependencies": { 1137 | "path-exists": { 1138 | "version": "3.0.0", 1139 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1140 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 1141 | } 1142 | } 1143 | }, 1144 | "uri-js": { 1145 | "version": "4.2.2", 1146 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1147 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1148 | "requires": { 1149 | "punycode": "^2.1.0" 1150 | } 1151 | }, 1152 | "util-deprecate": { 1153 | "version": "1.0.2", 1154 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1155 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1156 | }, 1157 | "uuid": { 1158 | "version": "3.3.2", 1159 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1160 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 1161 | }, 1162 | "validate-npm-package-license": { 1163 | "version": "3.0.4", 1164 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1165 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1166 | "requires": { 1167 | "spdx-correct": "^3.0.0", 1168 | "spdx-expression-parse": "^3.0.0" 1169 | } 1170 | }, 1171 | "verror": { 1172 | "version": "1.10.0", 1173 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1174 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1175 | "requires": { 1176 | "assert-plus": "^1.0.0", 1177 | "core-util-is": "1.0.2", 1178 | "extsprintf": "^1.2.0" 1179 | } 1180 | }, 1181 | "xtend": { 1182 | "version": "2.1.2", 1183 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", 1184 | "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", 1185 | "requires": { 1186 | "object-keys": "~0.4.0" 1187 | } 1188 | }, 1189 | "yauzl": { 1190 | "version": "2.4.1", 1191 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", 1192 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", 1193 | "requires": { 1194 | "fd-slicer": "~1.0.1" 1195 | } 1196 | } 1197 | } 1198 | } 1199 | -------------------------------------------------------------------------------- /package-release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | electron-packager . Overcast --icon=icon --overwrite --out=bin 3 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "overcast-macos", 3 | "version": "0.2.2", 4 | "description": "A minimal Overcast desktop application for macOS.", 5 | "main": "main.js", 6 | "scripts": { 7 | "start": "electron ." 8 | }, 9 | "repository": "https://github.com/nathanbirrell/overcast-macos", 10 | "keywords": [ 11 | "Electron", 12 | "overcast", 13 | "desktop", 14 | "macos" 15 | ], 16 | "author": "Nathan Birrell", 17 | "license": "CC0-1.0", 18 | "productName": "Overcast", 19 | "dependencies": { 20 | "electron": "^3.0.9", 21 | "electron-config": "^0.2.1", 22 | "electron-context-menu": "^0.8.0" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /renderer.js: -------------------------------------------------------------------------------- 1 | // This file is required by the index.html file and will 2 | // be executed in the renderer process for that window. 3 | // All of the Node.js APIs are available in this process. 4 | 5 | const { setCurrentUri, getCurrentUri } = require('electron').remote.require('./main.js') 6 | const path = require('path') 7 | const contextMenu = require('electron-context-menu') 8 | var { ipcRenderer } = require('electron'); 9 | 10 | const webview = document.getElementById('webview') 11 | const loader = document.querySelector('.loader') 12 | const isLoadingClass = 'is-loading' 13 | 14 | let loadedCurrent = false; 15 | 16 | onload = () => { 17 | const loadstart = () => { 18 | loader.classList.add(isLoadingClass) 19 | 20 | if (!loadedCurrent) { 21 | webview.loadURL(getCurrentUri()) 22 | } 23 | 24 | loadedCurrent = true; 25 | } 26 | 27 | const loadstop = () => { 28 | loader.classList.remove(isLoadingClass) 29 | } 30 | 31 | webview.addEventListener('dom-ready', () => { 32 | contextMenu({window: webview}) 33 | }) 34 | 35 | webview.addEventListener('did-start-loading', loadstart) 36 | webview.addEventListener('did-stop-loading', loadstop) 37 | 38 | webview.addEventListener('did-navigate-in-page', function (event) { 39 | setCurrentUri(webview.getURL()); 40 | }) 41 | } 42 | 43 | // Listeners (for events from the main process) 44 | ipcRenderer.on('navigate', function(event, direction){ 45 | switch (direction) { 46 | case 'back': 47 | webview.getWebContents().goBack() 48 | break; 49 | case 'forward': 50 | webview.getWebContents().goForward() 51 | break; 52 | default: 53 | break; 54 | } 55 | }); 56 | 57 | ipcRenderer.on('playback', function(event, action){ 58 | switch (action) { 59 | case 'playpause': 60 | webview.executeJavaScript("document.getElementById('playpausebutton').click()"); 61 | break; 62 | case 'next': 63 | webview.executeJavaScript("document.getElementById('seekforwardbutton').click()"); 64 | break; 65 | case 'previous': 66 | webview.executeJavaScript("document.getElementById('seekbackbutton').click()"); 67 | break; 68 | default: 69 | break; 70 | } 71 | }); 72 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | width: 100%; height: 100%; margin: 0; 4 | background: #fff; 5 | display: flex; 6 | align-items: center; 7 | } 8 | 9 | @media (max-width: 420px) { 10 | body { 11 | padding-top: 62px; 12 | } 13 | } 14 | 15 | .loader { 16 | background-image: url("loader.svg"); 17 | background-size: contain; 18 | display: none; 19 | height: 48px; 20 | width: 48px; 21 | position: absolute; 22 | left: 47%; 23 | margin: 0 auto; 24 | } 25 | .loader.is-loading { 26 | display: block; 27 | animation: loader infinite 0.5s; 28 | } 29 | @keyframes loader { 30 | 0% { 31 | transform: scale(1); 32 | } 33 | 50% { 34 | transform: scale(.90); 35 | } 36 | 100% { 37 | transform: scale(1); 38 | } 39 | } 40 | 41 | webview { 42 | width: 100%; 43 | height: 100%; 44 | z-index: 1; 45 | } 46 | 47 | .title-bar { 48 | -webkit-app-region: drag; 49 | position: absolute; 50 | display: block; 51 | height: 34px; 52 | width: 100%; 53 | top: 0; 54 | z-index: 999999; 55 | background: #fff; 56 | opacity: 0.8; 57 | } 58 | --------------------------------------------------------------------------------