├── .gitignore
├── LICENSE
├── README.md
├── _config.yml
├── launch.js
├── package-lock.json
├── package.json
├── screenshot
└── screen-recorder.gif
└── src
├── Icon.icns
├── IconTemplate.png
├── IconTemplate@2x.png
├── app.js
├── assets
├── fonts
│ ├── themify.eot
│ ├── themify.svg
│ ├── themify.ttf
│ └── themify.woff
└── themify-icons.css
├── index.html
├── main.js
├── picker.css
├── picker.html
├── picker.js
└── screen-recorder.css
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | path.txt
4 | .DS_Store
5 | npm-debug.log
6 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | BSD 3-Clause License
2 |
3 | Copyright (c) 2016, Haojian Wu
4 | All rights reserved.
5 |
6 | Redistribution and use in source and binary forms, with or without
7 | modification, are permitted provided that the following conditions are met:
8 |
9 | * Redistributions of source code must retain the above copyright notice, this
10 | list of conditions and the following disclaimer.
11 |
12 | * Redistributions in binary form must reproduce the above copyright notice,
13 | this list of conditions and the following disclaimer in the documentation
14 | and/or other materials provided with the distribution.
15 |
16 | * Neither the name of the copyright holder nor the names of its
17 | contributors may be used to endorse or promote products derived from
18 | this software without specific prior written permission.
19 |
20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Electron Screen Recorder
2 |
3 | This is an electron-based screen recorder application. It uses WebRTC and
4 | [`desktopCapture`](https://github.com/electron/electron/blob/master/docs/api/desktop-capturer.md#desktopcapturer) API for audio/video recording.
5 |
6 | You can choose a specific screen/window to record, and the record file is saved
7 | as `webm`.
8 |
9 | 
10 |
11 | ## Using
12 |
13 | ```sh
14 | npm install -g electron-screen-recorder
15 | electron-screen-recorder
16 | ```
17 |
18 | ## License
19 |
20 | [BSD](LICENSE)
21 |
22 | ## Donation
23 |
24 | If this project helped you reduce time to develop, you can buy me a cup of coffee :)
25 |
26 | [](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=CNEG9K5ARLDZU)
27 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-leap-day
--------------------------------------------------------------------------------
/launch.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | const electron = require('electron')
4 | const proc = require('child_process')
5 |
6 | // launch Electron
7 | var child = proc.spawn(electron, [__dirname])
8 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "electron-screen-recorder",
3 | "version": "0.0.3",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@types/node": {
8 | "version": "7.0.48",
9 | "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.48.tgz",
10 | "integrity": "sha512-LLlXafM3BD52MH056tHxTXO8JFCnpJJQkdzIU3+m8ew+CXJY/5zIXgDNb4TK/QFvlI8QexLS5tL+sE0Qhegr1w=="
11 | },
12 | "abbrev": {
13 | "version": "1.1.1",
14 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
15 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
16 | "dev": true
17 | },
18 | "ajv": {
19 | "version": "5.5.1",
20 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.1.tgz",
21 | "integrity": "sha1-s4u4h22ehr7plJVqBOch6IskjrI=",
22 | "requires": {
23 | "co": "4.6.0",
24 | "fast-deep-equal": "1.0.0",
25 | "fast-json-stable-stringify": "2.0.0",
26 | "json-schema-traverse": "0.3.1"
27 | }
28 | },
29 | "ansi-regex": {
30 | "version": "2.1.1",
31 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
32 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
33 | },
34 | "any-promise": {
35 | "version": "1.3.0",
36 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
37 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
38 | "dev": true
39 | },
40 | "array-find-index": {
41 | "version": "1.0.2",
42 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
43 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E="
44 | },
45 | "asar": {
46 | "version": "0.14.0",
47 | "resolved": "https://registry.npmjs.org/asar/-/asar-0.14.0.tgz",
48 | "integrity": "sha512-l21mf5pG65qbtD5WhymthfbE7ash0goQ+5ayo3lIncxtFNYH1PVArqsGXoAUXOd877mJplWSD9nGumByzQqVSA==",
49 | "dev": true,
50 | "requires": {
51 | "chromium-pickle-js": "0.2.0",
52 | "commander": "2.12.2",
53 | "cuint": "0.2.2",
54 | "glob": "6.0.4",
55 | "minimatch": "3.0.4",
56 | "mkdirp": "0.5.0",
57 | "mksnapshot": "0.3.1",
58 | "tmp": "0.0.28"
59 | },
60 | "dependencies": {
61 | "glob": {
62 | "version": "6.0.4",
63 | "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
64 | "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
65 | "dev": true,
66 | "requires": {
67 | "inflight": "1.0.6",
68 | "inherits": "2.0.3",
69 | "minimatch": "3.0.4",
70 | "once": "1.4.0",
71 | "path-is-absolute": "1.0.1"
72 | }
73 | }
74 | }
75 | },
76 | "asn1": {
77 | "version": "0.2.3",
78 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
79 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
80 | },
81 | "assert-plus": {
82 | "version": "1.0.0",
83 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
84 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
85 | },
86 | "asynckit": {
87 | "version": "0.4.0",
88 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
89 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
90 | },
91 | "author-regex": {
92 | "version": "1.0.0",
93 | "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz",
94 | "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=",
95 | "dev": true
96 | },
97 | "aws-sign2": {
98 | "version": "0.7.0",
99 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
100 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
101 | },
102 | "aws4": {
103 | "version": "1.6.0",
104 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
105 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4="
106 | },
107 | "balanced-match": {
108 | "version": "1.0.0",
109 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
110 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
111 | },
112 | "base64-js": {
113 | "version": "1.2.0",
114 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
115 | "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=",
116 | "dev": true
117 | },
118 | "bcrypt-pbkdf": {
119 | "version": "1.0.1",
120 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
121 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
122 | "optional": true,
123 | "requires": {
124 | "tweetnacl": "0.14.5"
125 | }
126 | },
127 | "binary": {
128 | "version": "0.3.0",
129 | "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
130 | "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=",
131 | "dev": true,
132 | "requires": {
133 | "buffers": "0.1.1",
134 | "chainsaw": "0.1.0"
135 | }
136 | },
137 | "bluebird": {
138 | "version": "3.5.1",
139 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
140 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
141 | "dev": true
142 | },
143 | "boom": {
144 | "version": "4.3.1",
145 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
146 | "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
147 | "requires": {
148 | "hoek": "4.2.0"
149 | }
150 | },
151 | "brace-expansion": {
152 | "version": "1.1.8",
153 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
154 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
155 | "requires": {
156 | "balanced-match": "1.0.0",
157 | "concat-map": "0.0.1"
158 | }
159 | },
160 | "buffers": {
161 | "version": "0.1.1",
162 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
163 | "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=",
164 | "dev": true
165 | },
166 | "builtin-modules": {
167 | "version": "1.1.1",
168 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
169 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
170 | },
171 | "camelcase": {
172 | "version": "2.1.1",
173 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
174 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
175 | },
176 | "camelcase-keys": {
177 | "version": "2.1.0",
178 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
179 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
180 | "requires": {
181 | "camelcase": "2.1.1",
182 | "map-obj": "1.0.1"
183 | }
184 | },
185 | "caseless": {
186 | "version": "0.12.0",
187 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
188 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
189 | },
190 | "chainsaw": {
191 | "version": "0.1.0",
192 | "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
193 | "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=",
194 | "dev": true,
195 | "requires": {
196 | "traverse": "0.3.9"
197 | }
198 | },
199 | "chromium-pickle-js": {
200 | "version": "0.2.0",
201 | "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
202 | "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=",
203 | "dev": true
204 | },
205 | "co": {
206 | "version": "4.6.0",
207 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
208 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
209 | },
210 | "code-point-at": {
211 | "version": "1.1.0",
212 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
213 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
214 | },
215 | "combined-stream": {
216 | "version": "1.0.5",
217 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
218 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
219 | "requires": {
220 | "delayed-stream": "1.0.0"
221 | }
222 | },
223 | "commander": {
224 | "version": "2.12.2",
225 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz",
226 | "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==",
227 | "dev": true
228 | },
229 | "compare-version": {
230 | "version": "0.1.2",
231 | "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
232 | "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=",
233 | "dev": true
234 | },
235 | "concat-map": {
236 | "version": "0.0.1",
237 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
238 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
239 | },
240 | "concat-stream": {
241 | "version": "1.6.0",
242 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
243 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
244 | "requires": {
245 | "inherits": "2.0.3",
246 | "readable-stream": "2.3.3",
247 | "typedarray": "0.0.6"
248 | },
249 | "dependencies": {
250 | "isarray": {
251 | "version": "1.0.0",
252 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
253 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
254 | },
255 | "readable-stream": {
256 | "version": "2.3.3",
257 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
258 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
259 | "requires": {
260 | "core-util-is": "1.0.2",
261 | "inherits": "2.0.3",
262 | "isarray": "1.0.0",
263 | "process-nextick-args": "1.0.7",
264 | "safe-buffer": "5.1.1",
265 | "string_decoder": "1.0.3",
266 | "util-deprecate": "1.0.2"
267 | }
268 | },
269 | "string_decoder": {
270 | "version": "1.0.3",
271 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
272 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
273 | "requires": {
274 | "safe-buffer": "5.1.1"
275 | }
276 | }
277 | }
278 | },
279 | "core-util-is": {
280 | "version": "1.0.2",
281 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
282 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
283 | },
284 | "cryptiles": {
285 | "version": "3.1.2",
286 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
287 | "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
288 | "requires": {
289 | "boom": "5.2.0"
290 | },
291 | "dependencies": {
292 | "boom": {
293 | "version": "5.2.0",
294 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
295 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
296 | "requires": {
297 | "hoek": "4.2.0"
298 | }
299 | }
300 | }
301 | },
302 | "cuint": {
303 | "version": "0.2.2",
304 | "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz",
305 | "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=",
306 | "dev": true
307 | },
308 | "currently-unhandled": {
309 | "version": "0.4.1",
310 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
311 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
312 | "requires": {
313 | "array-find-index": "1.0.2"
314 | }
315 | },
316 | "dashdash": {
317 | "version": "1.14.1",
318 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
319 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
320 | "requires": {
321 | "assert-plus": "1.0.0"
322 | }
323 | },
324 | "debug": {
325 | "version": "2.6.9",
326 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
327 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
328 | "requires": {
329 | "ms": "2.0.0"
330 | }
331 | },
332 | "decamelize": {
333 | "version": "1.2.0",
334 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
335 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
336 | },
337 | "decompress-zip": {
338 | "version": "0.3.0",
339 | "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.0.tgz",
340 | "integrity": "sha1-rjvLfjTGWHmt/nfhnDD4ZgK0vbA=",
341 | "dev": true,
342 | "requires": {
343 | "binary": "0.3.0",
344 | "graceful-fs": "4.1.11",
345 | "mkpath": "0.1.0",
346 | "nopt": "3.0.6",
347 | "q": "1.5.1",
348 | "readable-stream": "1.1.14",
349 | "touch": "0.0.3"
350 | }
351 | },
352 | "deep-extend": {
353 | "version": "0.4.2",
354 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
355 | "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8="
356 | },
357 | "delayed-stream": {
358 | "version": "1.0.0",
359 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
360 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
361 | },
362 | "domify": {
363 | "version": "1.4.0",
364 | "resolved": "https://registry.npmjs.org/domify/-/domify-1.4.0.tgz",
365 | "integrity": "sha1-EUg2F/dk+GlZdbS9x5sU8IA7Yps="
366 | },
367 | "ecc-jsbn": {
368 | "version": "0.1.1",
369 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
370 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
371 | "optional": true,
372 | "requires": {
373 | "jsbn": "0.1.1"
374 | }
375 | },
376 | "electron": {
377 | "version": "1.7.9",
378 | "resolved": "https://registry.npmjs.org/electron/-/electron-1.7.9.tgz",
379 | "integrity": "sha1-rdVOn4+D7QL2UZ7BATX2mLGTNs8=",
380 | "requires": {
381 | "@types/node": "7.0.48",
382 | "electron-download": "3.3.0",
383 | "extract-zip": "1.6.6"
384 | }
385 | },
386 | "electron-download": {
387 | "version": "3.3.0",
388 | "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz",
389 | "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=",
390 | "requires": {
391 | "debug": "2.6.9",
392 | "fs-extra": "0.30.0",
393 | "home-path": "1.0.5",
394 | "minimist": "1.2.0",
395 | "nugget": "2.0.1",
396 | "path-exists": "2.1.0",
397 | "rc": "1.2.2",
398 | "semver": "5.4.1",
399 | "sumchecker": "1.3.1"
400 | }
401 | },
402 | "electron-osx-sign": {
403 | "version": "0.4.7",
404 | "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.7.tgz",
405 | "integrity": "sha1-HXVkeoJ0jqzUi+pwYW7IP/rePuU=",
406 | "dev": true,
407 | "requires": {
408 | "bluebird": "3.5.1",
409 | "compare-version": "0.1.2",
410 | "debug": "2.6.9",
411 | "isbinaryfile": "3.0.2",
412 | "minimist": "1.2.0",
413 | "plist": "2.1.0"
414 | }
415 | },
416 | "electron-packager": {
417 | "version": "10.1.0",
418 | "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-10.1.0.tgz",
419 | "integrity": "sha1-t84pQOlJ294NrI+yCvy509mBn5Q=",
420 | "dev": true,
421 | "requires": {
422 | "asar": "0.14.0",
423 | "debug": "3.1.0",
424 | "electron-download": "4.1.0",
425 | "electron-osx-sign": "0.4.7",
426 | "extract-zip": "1.6.6",
427 | "fs-extra": "4.0.3",
428 | "get-package-info": "1.0.0",
429 | "mz": "2.7.0",
430 | "nodeify": "1.0.1",
431 | "parse-author": "2.0.0",
432 | "pify": "3.0.0",
433 | "plist": "2.1.0",
434 | "pruner": "0.0.7",
435 | "rcedit": "0.9.0",
436 | "resolve": "1.5.0",
437 | "sanitize-filename": "1.6.1",
438 | "semver": "5.4.1",
439 | "yargs-parser": "8.0.0"
440 | },
441 | "dependencies": {
442 | "debug": {
443 | "version": "3.1.0",
444 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
445 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
446 | "dev": true,
447 | "requires": {
448 | "ms": "2.0.0"
449 | }
450 | },
451 | "electron-download": {
452 | "version": "4.1.0",
453 | "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.0.tgz",
454 | "integrity": "sha1-v5MsdG8vh//MCdHdRy8v9rkYeEU=",
455 | "dev": true,
456 | "requires": {
457 | "debug": "2.6.9",
458 | "env-paths": "1.0.0",
459 | "fs-extra": "2.1.2",
460 | "minimist": "1.2.0",
461 | "nugget": "2.0.1",
462 | "path-exists": "3.0.0",
463 | "rc": "1.2.2",
464 | "semver": "5.4.1",
465 | "sumchecker": "2.0.2"
466 | },
467 | "dependencies": {
468 | "debug": {
469 | "version": "2.6.9",
470 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
471 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
472 | "dev": true,
473 | "requires": {
474 | "ms": "2.0.0"
475 | }
476 | },
477 | "fs-extra": {
478 | "version": "2.1.2",
479 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz",
480 | "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=",
481 | "dev": true,
482 | "requires": {
483 | "graceful-fs": "4.1.11",
484 | "jsonfile": "2.4.0"
485 | }
486 | }
487 | }
488 | },
489 | "fs-extra": {
490 | "version": "4.0.3",
491 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
492 | "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
493 | "dev": true,
494 | "requires": {
495 | "graceful-fs": "4.1.11",
496 | "jsonfile": "4.0.0",
497 | "universalify": "0.1.1"
498 | },
499 | "dependencies": {
500 | "jsonfile": {
501 | "version": "4.0.0",
502 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
503 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
504 | "dev": true,
505 | "requires": {
506 | "graceful-fs": "4.1.11"
507 | }
508 | }
509 | }
510 | },
511 | "path-exists": {
512 | "version": "3.0.0",
513 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
514 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
515 | "dev": true
516 | },
517 | "pify": {
518 | "version": "3.0.0",
519 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
520 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
521 | "dev": true
522 | },
523 | "sumchecker": {
524 | "version": "2.0.2",
525 | "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz",
526 | "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=",
527 | "dev": true,
528 | "requires": {
529 | "debug": "2.6.9"
530 | },
531 | "dependencies": {
532 | "debug": {
533 | "version": "2.6.9",
534 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
535 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
536 | "dev": true,
537 | "requires": {
538 | "ms": "2.0.0"
539 | }
540 | }
541 | }
542 | }
543 | }
544 | },
545 | "electron-prebuilt": {
546 | "version": "1.4.13",
547 | "resolved": "https://registry.npmjs.org/electron-prebuilt/-/electron-prebuilt-1.4.13.tgz",
548 | "integrity": "sha1-Cg5Ne/iVokIGHM+rKTlNzaHaM9I=",
549 | "dev": true,
550 | "requires": {
551 | "electron-download": "3.3.0",
552 | "extract-zip": "1.6.6"
553 | }
554 | },
555 | "env-paths": {
556 | "version": "1.0.0",
557 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz",
558 | "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=",
559 | "dev": true
560 | },
561 | "error-ex": {
562 | "version": "1.3.1",
563 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
564 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
565 | "requires": {
566 | "is-arrayish": "0.2.1"
567 | }
568 | },
569 | "es6-promise": {
570 | "version": "4.1.1",
571 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz",
572 | "integrity": "sha512-OaU1hHjgJf+b0NzsxCg7NdIYERD6Hy/PEmFLTjw+b65scuisG3Kt4QoTvJ66BBkPZ581gr0kpoVzKnxniM8nng=="
573 | },
574 | "extend": {
575 | "version": "3.0.1",
576 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
577 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
578 | },
579 | "extract-zip": {
580 | "version": "1.6.6",
581 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz",
582 | "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=",
583 | "requires": {
584 | "concat-stream": "1.6.0",
585 | "debug": "2.6.9",
586 | "mkdirp": "0.5.0",
587 | "yauzl": "2.4.1"
588 | }
589 | },
590 | "extsprintf": {
591 | "version": "1.3.0",
592 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
593 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
594 | },
595 | "fast-deep-equal": {
596 | "version": "1.0.0",
597 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
598 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8="
599 | },
600 | "fast-json-stable-stringify": {
601 | "version": "2.0.0",
602 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
603 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
604 | },
605 | "fd-slicer": {
606 | "version": "1.0.1",
607 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
608 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
609 | "requires": {
610 | "pend": "1.2.0"
611 | }
612 | },
613 | "find-up": {
614 | "version": "1.1.2",
615 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
616 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
617 | "requires": {
618 | "path-exists": "2.1.0",
619 | "pinkie-promise": "2.0.1"
620 | }
621 | },
622 | "forever-agent": {
623 | "version": "0.6.1",
624 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
625 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
626 | },
627 | "form-data": {
628 | "version": "2.3.1",
629 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz",
630 | "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=",
631 | "requires": {
632 | "asynckit": "0.4.0",
633 | "combined-stream": "1.0.5",
634 | "mime-types": "2.1.17"
635 | }
636 | },
637 | "fs-extra": {
638 | "version": "0.30.0",
639 | "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
640 | "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=",
641 | "requires": {
642 | "graceful-fs": "4.1.11",
643 | "jsonfile": "2.4.0",
644 | "klaw": "1.3.1",
645 | "path-is-absolute": "1.0.1",
646 | "rimraf": "2.6.2"
647 | }
648 | },
649 | "fs.realpath": {
650 | "version": "1.0.0",
651 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
652 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
653 | },
654 | "get-package-info": {
655 | "version": "1.0.0",
656 | "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz",
657 | "integrity": "sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw=",
658 | "dev": true,
659 | "requires": {
660 | "bluebird": "3.5.1",
661 | "debug": "2.6.9",
662 | "lodash.get": "4.4.2",
663 | "read-pkg-up": "2.0.0"
664 | },
665 | "dependencies": {
666 | "find-up": {
667 | "version": "2.1.0",
668 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
669 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
670 | "dev": true,
671 | "requires": {
672 | "locate-path": "2.0.0"
673 | }
674 | },
675 | "load-json-file": {
676 | "version": "2.0.0",
677 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
678 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
679 | "dev": true,
680 | "requires": {
681 | "graceful-fs": "4.1.11",
682 | "parse-json": "2.2.0",
683 | "pify": "2.3.0",
684 | "strip-bom": "3.0.0"
685 | }
686 | },
687 | "path-type": {
688 | "version": "2.0.0",
689 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
690 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
691 | "dev": true,
692 | "requires": {
693 | "pify": "2.3.0"
694 | }
695 | },
696 | "read-pkg": {
697 | "version": "2.0.0",
698 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
699 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
700 | "dev": true,
701 | "requires": {
702 | "load-json-file": "2.0.0",
703 | "normalize-package-data": "2.4.0",
704 | "path-type": "2.0.0"
705 | }
706 | },
707 | "read-pkg-up": {
708 | "version": "2.0.0",
709 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
710 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
711 | "dev": true,
712 | "requires": {
713 | "find-up": "2.1.0",
714 | "read-pkg": "2.0.0"
715 | }
716 | },
717 | "strip-bom": {
718 | "version": "3.0.0",
719 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
720 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
721 | "dev": true
722 | }
723 | }
724 | },
725 | "get-stdin": {
726 | "version": "4.0.1",
727 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
728 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4="
729 | },
730 | "getpass": {
731 | "version": "0.1.7",
732 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
733 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
734 | "requires": {
735 | "assert-plus": "1.0.0"
736 | }
737 | },
738 | "glob": {
739 | "version": "7.1.2",
740 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
741 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
742 | "requires": {
743 | "fs.realpath": "1.0.0",
744 | "inflight": "1.0.6",
745 | "inherits": "2.0.3",
746 | "minimatch": "3.0.4",
747 | "once": "1.4.0",
748 | "path-is-absolute": "1.0.1"
749 | }
750 | },
751 | "graceful-fs": {
752 | "version": "4.1.11",
753 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
754 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
755 | },
756 | "har-schema": {
757 | "version": "2.0.0",
758 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
759 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
760 | },
761 | "har-validator": {
762 | "version": "5.0.3",
763 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
764 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
765 | "requires": {
766 | "ajv": "5.5.1",
767 | "har-schema": "2.0.0"
768 | }
769 | },
770 | "hawk": {
771 | "version": "6.0.2",
772 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
773 | "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
774 | "requires": {
775 | "boom": "4.3.1",
776 | "cryptiles": "3.1.2",
777 | "hoek": "4.2.0",
778 | "sntp": "2.1.0"
779 | }
780 | },
781 | "hoek": {
782 | "version": "4.2.0",
783 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz",
784 | "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ=="
785 | },
786 | "home-path": {
787 | "version": "1.0.5",
788 | "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.5.tgz",
789 | "integrity": "sha1-eIspgVsS1Tus9XVkhHbm+QQdEz8="
790 | },
791 | "hosted-git-info": {
792 | "version": "2.5.0",
793 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
794 | "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg=="
795 | },
796 | "http-signature": {
797 | "version": "1.2.0",
798 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
799 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
800 | "requires": {
801 | "assert-plus": "1.0.0",
802 | "jsprim": "1.4.1",
803 | "sshpk": "1.13.1"
804 | }
805 | },
806 | "indent-string": {
807 | "version": "2.1.0",
808 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
809 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
810 | "requires": {
811 | "repeating": "2.0.1"
812 | }
813 | },
814 | "inflight": {
815 | "version": "1.0.6",
816 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
817 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
818 | "requires": {
819 | "once": "1.4.0",
820 | "wrappy": "1.0.2"
821 | }
822 | },
823 | "inherits": {
824 | "version": "2.0.3",
825 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
826 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
827 | },
828 | "ini": {
829 | "version": "1.3.5",
830 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
831 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
832 | },
833 | "is-arrayish": {
834 | "version": "0.2.1",
835 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
836 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
837 | },
838 | "is-builtin-module": {
839 | "version": "1.0.0",
840 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
841 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
842 | "requires": {
843 | "builtin-modules": "1.1.1"
844 | }
845 | },
846 | "is-finite": {
847 | "version": "1.0.2",
848 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
849 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
850 | "requires": {
851 | "number-is-nan": "1.0.1"
852 | }
853 | },
854 | "is-fullwidth-code-point": {
855 | "version": "1.0.0",
856 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
857 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
858 | "requires": {
859 | "number-is-nan": "1.0.1"
860 | }
861 | },
862 | "is-promise": {
863 | "version": "1.0.1",
864 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz",
865 | "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=",
866 | "dev": true
867 | },
868 | "is-typedarray": {
869 | "version": "1.0.0",
870 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
871 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
872 | },
873 | "is-utf8": {
874 | "version": "0.2.1",
875 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
876 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
877 | },
878 | "isarray": {
879 | "version": "0.0.1",
880 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
881 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
882 | },
883 | "isbinaryfile": {
884 | "version": "3.0.2",
885 | "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz",
886 | "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=",
887 | "dev": true
888 | },
889 | "isstream": {
890 | "version": "0.1.2",
891 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
892 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
893 | },
894 | "jsbn": {
895 | "version": "0.1.1",
896 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
897 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
898 | "optional": true
899 | },
900 | "json-schema": {
901 | "version": "0.2.3",
902 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
903 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
904 | },
905 | "json-schema-traverse": {
906 | "version": "0.3.1",
907 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
908 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
909 | },
910 | "json-stringify-safe": {
911 | "version": "5.0.1",
912 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
913 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
914 | },
915 | "jsonfile": {
916 | "version": "2.4.0",
917 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
918 | "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
919 | "requires": {
920 | "graceful-fs": "4.1.11"
921 | }
922 | },
923 | "jsprim": {
924 | "version": "1.4.1",
925 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
926 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
927 | "requires": {
928 | "assert-plus": "1.0.0",
929 | "extsprintf": "1.3.0",
930 | "json-schema": "0.2.3",
931 | "verror": "1.10.0"
932 | }
933 | },
934 | "klaw": {
935 | "version": "1.3.1",
936 | "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
937 | "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
938 | "requires": {
939 | "graceful-fs": "4.1.11"
940 | }
941 | },
942 | "load-json-file": {
943 | "version": "1.1.0",
944 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
945 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
946 | "requires": {
947 | "graceful-fs": "4.1.11",
948 | "parse-json": "2.2.0",
949 | "pify": "2.3.0",
950 | "pinkie-promise": "2.0.1",
951 | "strip-bom": "2.0.0"
952 | }
953 | },
954 | "locate-path": {
955 | "version": "2.0.0",
956 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
957 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
958 | "dev": true,
959 | "requires": {
960 | "p-locate": "2.0.0",
961 | "path-exists": "3.0.0"
962 | },
963 | "dependencies": {
964 | "path-exists": {
965 | "version": "3.0.0",
966 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
967 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
968 | "dev": true
969 | }
970 | }
971 | },
972 | "lodash.get": {
973 | "version": "4.4.2",
974 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
975 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
976 | "dev": true
977 | },
978 | "loud-rejection": {
979 | "version": "1.6.0",
980 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
981 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
982 | "requires": {
983 | "currently-unhandled": "0.4.1",
984 | "signal-exit": "3.0.2"
985 | }
986 | },
987 | "map-obj": {
988 | "version": "1.0.1",
989 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
990 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
991 | },
992 | "meow": {
993 | "version": "3.7.0",
994 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
995 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
996 | "requires": {
997 | "camelcase-keys": "2.1.0",
998 | "decamelize": "1.2.0",
999 | "loud-rejection": "1.6.0",
1000 | "map-obj": "1.0.1",
1001 | "minimist": "1.2.0",
1002 | "normalize-package-data": "2.4.0",
1003 | "object-assign": "4.1.1",
1004 | "read-pkg-up": "1.0.1",
1005 | "redent": "1.0.0",
1006 | "trim-newlines": "1.0.0"
1007 | }
1008 | },
1009 | "mime-db": {
1010 | "version": "1.30.0",
1011 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
1012 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE="
1013 | },
1014 | "mime-types": {
1015 | "version": "2.1.17",
1016 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
1017 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
1018 | "requires": {
1019 | "mime-db": "1.30.0"
1020 | }
1021 | },
1022 | "minimatch": {
1023 | "version": "3.0.4",
1024 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1025 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1026 | "requires": {
1027 | "brace-expansion": "1.1.8"
1028 | }
1029 | },
1030 | "minimist": {
1031 | "version": "1.2.0",
1032 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
1033 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
1034 | },
1035 | "mkdirp": {
1036 | "version": "0.5.0",
1037 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
1038 | "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=",
1039 | "requires": {
1040 | "minimist": "0.0.8"
1041 | },
1042 | "dependencies": {
1043 | "minimist": {
1044 | "version": "0.0.8",
1045 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1046 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
1047 | }
1048 | }
1049 | },
1050 | "mkpath": {
1051 | "version": "0.1.0",
1052 | "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz",
1053 | "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=",
1054 | "dev": true
1055 | },
1056 | "mksnapshot": {
1057 | "version": "0.3.1",
1058 | "resolved": "https://registry.npmjs.org/mksnapshot/-/mksnapshot-0.3.1.tgz",
1059 | "integrity": "sha1-JQHAVldDbXQs6Vik/5LHfkDdN+Y=",
1060 | "dev": true,
1061 | "requires": {
1062 | "decompress-zip": "0.3.0",
1063 | "fs-extra": "0.26.7",
1064 | "request": "2.83.0"
1065 | },
1066 | "dependencies": {
1067 | "fs-extra": {
1068 | "version": "0.26.7",
1069 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz",
1070 | "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=",
1071 | "dev": true,
1072 | "requires": {
1073 | "graceful-fs": "4.1.11",
1074 | "jsonfile": "2.4.0",
1075 | "klaw": "1.3.1",
1076 | "path-is-absolute": "1.0.1",
1077 | "rimraf": "2.6.2"
1078 | }
1079 | }
1080 | }
1081 | },
1082 | "ms": {
1083 | "version": "2.0.0",
1084 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1085 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1086 | },
1087 | "mz": {
1088 | "version": "2.7.0",
1089 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
1090 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
1091 | "dev": true,
1092 | "requires": {
1093 | "any-promise": "1.3.0",
1094 | "object-assign": "4.1.1",
1095 | "thenify-all": "1.6.0"
1096 | }
1097 | },
1098 | "nodeify": {
1099 | "version": "1.0.1",
1100 | "resolved": "https://registry.npmjs.org/nodeify/-/nodeify-1.0.1.tgz",
1101 | "integrity": "sha1-ZKtpp7268DzhB7TwM1yHwLnpGx0=",
1102 | "dev": true,
1103 | "requires": {
1104 | "is-promise": "1.0.1",
1105 | "promise": "1.3.0"
1106 | }
1107 | },
1108 | "nopt": {
1109 | "version": "3.0.6",
1110 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
1111 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
1112 | "dev": true,
1113 | "requires": {
1114 | "abbrev": "1.1.1"
1115 | }
1116 | },
1117 | "normalize-package-data": {
1118 | "version": "2.4.0",
1119 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
1120 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
1121 | "requires": {
1122 | "hosted-git-info": "2.5.0",
1123 | "is-builtin-module": "1.0.0",
1124 | "semver": "5.4.1",
1125 | "validate-npm-package-license": "3.0.1"
1126 | }
1127 | },
1128 | "nugget": {
1129 | "version": "2.0.1",
1130 | "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz",
1131 | "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=",
1132 | "requires": {
1133 | "debug": "2.6.9",
1134 | "minimist": "1.2.0",
1135 | "pretty-bytes": "1.0.4",
1136 | "progress-stream": "1.2.0",
1137 | "request": "2.83.0",
1138 | "single-line-log": "1.1.2",
1139 | "throttleit": "0.0.2"
1140 | }
1141 | },
1142 | "number-is-nan": {
1143 | "version": "1.0.1",
1144 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1145 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
1146 | },
1147 | "oauth-sign": {
1148 | "version": "0.8.2",
1149 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
1150 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
1151 | },
1152 | "object-assign": {
1153 | "version": "4.1.1",
1154 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1155 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1156 | },
1157 | "object-keys": {
1158 | "version": "0.4.0",
1159 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
1160 | "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY="
1161 | },
1162 | "once": {
1163 | "version": "1.4.0",
1164 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1165 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1166 | "requires": {
1167 | "wrappy": "1.0.2"
1168 | }
1169 | },
1170 | "os-tmpdir": {
1171 | "version": "1.0.2",
1172 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1173 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1174 | "dev": true
1175 | },
1176 | "p-limit": {
1177 | "version": "1.1.0",
1178 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz",
1179 | "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=",
1180 | "dev": true
1181 | },
1182 | "p-locate": {
1183 | "version": "2.0.0",
1184 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
1185 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
1186 | "dev": true,
1187 | "requires": {
1188 | "p-limit": "1.1.0"
1189 | }
1190 | },
1191 | "parse-author": {
1192 | "version": "2.0.0",
1193 | "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz",
1194 | "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=",
1195 | "dev": true,
1196 | "requires": {
1197 | "author-regex": "1.0.0"
1198 | }
1199 | },
1200 | "parse-json": {
1201 | "version": "2.2.0",
1202 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
1203 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
1204 | "requires": {
1205 | "error-ex": "1.3.1"
1206 | }
1207 | },
1208 | "path-exists": {
1209 | "version": "2.1.0",
1210 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
1211 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
1212 | "requires": {
1213 | "pinkie-promise": "2.0.1"
1214 | }
1215 | },
1216 | "path-is-absolute": {
1217 | "version": "1.0.1",
1218 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1219 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
1220 | },
1221 | "path-parse": {
1222 | "version": "1.0.5",
1223 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
1224 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
1225 | "dev": true
1226 | },
1227 | "path-type": {
1228 | "version": "1.1.0",
1229 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
1230 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
1231 | "requires": {
1232 | "graceful-fs": "4.1.11",
1233 | "pify": "2.3.0",
1234 | "pinkie-promise": "2.0.1"
1235 | }
1236 | },
1237 | "pend": {
1238 | "version": "1.2.0",
1239 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
1240 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
1241 | },
1242 | "performance-now": {
1243 | "version": "2.1.0",
1244 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1245 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
1246 | },
1247 | "pify": {
1248 | "version": "2.3.0",
1249 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1250 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
1251 | },
1252 | "pinkie": {
1253 | "version": "2.0.4",
1254 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
1255 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
1256 | },
1257 | "pinkie-promise": {
1258 | "version": "2.0.1",
1259 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
1260 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
1261 | "requires": {
1262 | "pinkie": "2.0.4"
1263 | }
1264 | },
1265 | "plist": {
1266 | "version": "2.1.0",
1267 | "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz",
1268 | "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=",
1269 | "dev": true,
1270 | "requires": {
1271 | "base64-js": "1.2.0",
1272 | "xmlbuilder": "8.2.2",
1273 | "xmldom": "0.1.27"
1274 | }
1275 | },
1276 | "pretty-bytes": {
1277 | "version": "1.0.4",
1278 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz",
1279 | "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=",
1280 | "requires": {
1281 | "get-stdin": "4.0.1",
1282 | "meow": "3.7.0"
1283 | }
1284 | },
1285 | "process-nextick-args": {
1286 | "version": "1.0.7",
1287 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
1288 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
1289 | },
1290 | "progress-stream": {
1291 | "version": "1.2.0",
1292 | "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz",
1293 | "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=",
1294 | "requires": {
1295 | "speedometer": "0.1.4",
1296 | "through2": "0.2.3"
1297 | }
1298 | },
1299 | "promise": {
1300 | "version": "1.3.0",
1301 | "resolved": "https://registry.npmjs.org/promise/-/promise-1.3.0.tgz",
1302 | "integrity": "sha1-5cyaTIJ45GZP/twBx9qEhCsEAXU=",
1303 | "dev": true,
1304 | "requires": {
1305 | "is-promise": "1.0.1"
1306 | }
1307 | },
1308 | "pruner": {
1309 | "version": "0.0.7",
1310 | "resolved": "https://registry.npmjs.org/pruner/-/pruner-0.0.7.tgz",
1311 | "integrity": "sha1-NF+8s+gHARY6HXrfVrrCKaWh5ME=",
1312 | "dev": true,
1313 | "requires": {
1314 | "fs-extra": "4.0.3"
1315 | },
1316 | "dependencies": {
1317 | "fs-extra": {
1318 | "version": "4.0.3",
1319 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
1320 | "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
1321 | "dev": true,
1322 | "requires": {
1323 | "graceful-fs": "4.1.11",
1324 | "jsonfile": "4.0.0",
1325 | "universalify": "0.1.1"
1326 | }
1327 | },
1328 | "jsonfile": {
1329 | "version": "4.0.0",
1330 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
1331 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
1332 | "dev": true,
1333 | "requires": {
1334 | "graceful-fs": "4.1.11"
1335 | }
1336 | }
1337 | }
1338 | },
1339 | "punycode": {
1340 | "version": "1.4.1",
1341 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
1342 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
1343 | },
1344 | "q": {
1345 | "version": "1.5.1",
1346 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
1347 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
1348 | "dev": true
1349 | },
1350 | "qs": {
1351 | "version": "6.5.1",
1352 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
1353 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
1354 | },
1355 | "rc": {
1356 | "version": "1.2.2",
1357 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz",
1358 | "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=",
1359 | "requires": {
1360 | "deep-extend": "0.4.2",
1361 | "ini": "1.3.5",
1362 | "minimist": "1.2.0",
1363 | "strip-json-comments": "2.0.1"
1364 | }
1365 | },
1366 | "rcedit": {
1367 | "version": "0.9.0",
1368 | "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-0.9.0.tgz",
1369 | "integrity": "sha1-ORDfVzRTmeKwMl9KUZAH+J5V7xw=",
1370 | "dev": true
1371 | },
1372 | "read-pkg": {
1373 | "version": "1.1.0",
1374 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
1375 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
1376 | "requires": {
1377 | "load-json-file": "1.1.0",
1378 | "normalize-package-data": "2.4.0",
1379 | "path-type": "1.1.0"
1380 | }
1381 | },
1382 | "read-pkg-up": {
1383 | "version": "1.0.1",
1384 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
1385 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
1386 | "requires": {
1387 | "find-up": "1.1.2",
1388 | "read-pkg": "1.1.0"
1389 | }
1390 | },
1391 | "readable-stream": {
1392 | "version": "1.1.14",
1393 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
1394 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
1395 | "requires": {
1396 | "core-util-is": "1.0.2",
1397 | "inherits": "2.0.3",
1398 | "isarray": "0.0.1",
1399 | "string_decoder": "0.10.31"
1400 | }
1401 | },
1402 | "redent": {
1403 | "version": "1.0.0",
1404 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
1405 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
1406 | "requires": {
1407 | "indent-string": "2.1.0",
1408 | "strip-indent": "1.0.1"
1409 | }
1410 | },
1411 | "repeating": {
1412 | "version": "2.0.1",
1413 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
1414 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
1415 | "requires": {
1416 | "is-finite": "1.0.2"
1417 | }
1418 | },
1419 | "request": {
1420 | "version": "2.83.0",
1421 | "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz",
1422 | "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==",
1423 | "requires": {
1424 | "aws-sign2": "0.7.0",
1425 | "aws4": "1.6.0",
1426 | "caseless": "0.12.0",
1427 | "combined-stream": "1.0.5",
1428 | "extend": "3.0.1",
1429 | "forever-agent": "0.6.1",
1430 | "form-data": "2.3.1",
1431 | "har-validator": "5.0.3",
1432 | "hawk": "6.0.2",
1433 | "http-signature": "1.2.0",
1434 | "is-typedarray": "1.0.0",
1435 | "isstream": "0.1.2",
1436 | "json-stringify-safe": "5.0.1",
1437 | "mime-types": "2.1.17",
1438 | "oauth-sign": "0.8.2",
1439 | "performance-now": "2.1.0",
1440 | "qs": "6.5.1",
1441 | "safe-buffer": "5.1.1",
1442 | "stringstream": "0.0.5",
1443 | "tough-cookie": "2.3.3",
1444 | "tunnel-agent": "0.6.0",
1445 | "uuid": "3.1.0"
1446 | }
1447 | },
1448 | "resolve": {
1449 | "version": "1.5.0",
1450 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
1451 | "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
1452 | "dev": true,
1453 | "requires": {
1454 | "path-parse": "1.0.5"
1455 | }
1456 | },
1457 | "rimraf": {
1458 | "version": "2.6.2",
1459 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
1460 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
1461 | "requires": {
1462 | "glob": "7.1.2"
1463 | }
1464 | },
1465 | "safe-buffer": {
1466 | "version": "5.1.1",
1467 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
1468 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
1469 | },
1470 | "sanitize-filename": {
1471 | "version": "1.6.1",
1472 | "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.1.tgz",
1473 | "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=",
1474 | "dev": true,
1475 | "requires": {
1476 | "truncate-utf8-bytes": "1.0.2"
1477 | }
1478 | },
1479 | "semver": {
1480 | "version": "5.4.1",
1481 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
1482 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg=="
1483 | },
1484 | "signal-exit": {
1485 | "version": "3.0.2",
1486 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1487 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
1488 | },
1489 | "single-line-log": {
1490 | "version": "1.1.2",
1491 | "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz",
1492 | "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=",
1493 | "requires": {
1494 | "string-width": "1.0.2"
1495 | }
1496 | },
1497 | "sntp": {
1498 | "version": "2.1.0",
1499 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
1500 | "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
1501 | "requires": {
1502 | "hoek": "4.2.0"
1503 | }
1504 | },
1505 | "spdx-correct": {
1506 | "version": "1.0.2",
1507 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
1508 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
1509 | "requires": {
1510 | "spdx-license-ids": "1.2.2"
1511 | }
1512 | },
1513 | "spdx-expression-parse": {
1514 | "version": "1.0.4",
1515 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
1516 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw="
1517 | },
1518 | "spdx-license-ids": {
1519 | "version": "1.2.2",
1520 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
1521 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc="
1522 | },
1523 | "speedometer": {
1524 | "version": "0.1.4",
1525 | "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz",
1526 | "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0="
1527 | },
1528 | "sshpk": {
1529 | "version": "1.13.1",
1530 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
1531 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
1532 | "requires": {
1533 | "asn1": "0.2.3",
1534 | "assert-plus": "1.0.0",
1535 | "bcrypt-pbkdf": "1.0.1",
1536 | "dashdash": "1.14.1",
1537 | "ecc-jsbn": "0.1.1",
1538 | "getpass": "0.1.7",
1539 | "jsbn": "0.1.1",
1540 | "tweetnacl": "0.14.5"
1541 | }
1542 | },
1543 | "string-width": {
1544 | "version": "1.0.2",
1545 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
1546 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
1547 | "requires": {
1548 | "code-point-at": "1.1.0",
1549 | "is-fullwidth-code-point": "1.0.0",
1550 | "strip-ansi": "3.0.1"
1551 | }
1552 | },
1553 | "string_decoder": {
1554 | "version": "0.10.31",
1555 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
1556 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
1557 | },
1558 | "stringstream": {
1559 | "version": "0.0.5",
1560 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
1561 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg="
1562 | },
1563 | "strip-ansi": {
1564 | "version": "3.0.1",
1565 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1566 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1567 | "requires": {
1568 | "ansi-regex": "2.1.1"
1569 | }
1570 | },
1571 | "strip-bom": {
1572 | "version": "2.0.0",
1573 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
1574 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
1575 | "requires": {
1576 | "is-utf8": "0.2.1"
1577 | }
1578 | },
1579 | "strip-indent": {
1580 | "version": "1.0.1",
1581 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
1582 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
1583 | "requires": {
1584 | "get-stdin": "4.0.1"
1585 | }
1586 | },
1587 | "strip-json-comments": {
1588 | "version": "2.0.1",
1589 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1590 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
1591 | },
1592 | "sumchecker": {
1593 | "version": "1.3.1",
1594 | "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz",
1595 | "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=",
1596 | "requires": {
1597 | "debug": "2.6.9",
1598 | "es6-promise": "4.1.1"
1599 | }
1600 | },
1601 | "thenify": {
1602 | "version": "3.3.0",
1603 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
1604 | "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
1605 | "dev": true,
1606 | "requires": {
1607 | "any-promise": "1.3.0"
1608 | }
1609 | },
1610 | "thenify-all": {
1611 | "version": "1.6.0",
1612 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
1613 | "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
1614 | "dev": true,
1615 | "requires": {
1616 | "thenify": "3.3.0"
1617 | }
1618 | },
1619 | "throttleit": {
1620 | "version": "0.0.2",
1621 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
1622 | "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8="
1623 | },
1624 | "through2": {
1625 | "version": "0.2.3",
1626 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
1627 | "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=",
1628 | "requires": {
1629 | "readable-stream": "1.1.14",
1630 | "xtend": "2.1.2"
1631 | }
1632 | },
1633 | "tmp": {
1634 | "version": "0.0.28",
1635 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz",
1636 | "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=",
1637 | "dev": true,
1638 | "requires": {
1639 | "os-tmpdir": "1.0.2"
1640 | }
1641 | },
1642 | "touch": {
1643 | "version": "0.0.3",
1644 | "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz",
1645 | "integrity": "sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0=",
1646 | "dev": true,
1647 | "requires": {
1648 | "nopt": "1.0.10"
1649 | },
1650 | "dependencies": {
1651 | "nopt": {
1652 | "version": "1.0.10",
1653 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1654 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
1655 | "dev": true,
1656 | "requires": {
1657 | "abbrev": "1.1.1"
1658 | }
1659 | }
1660 | }
1661 | },
1662 | "tough-cookie": {
1663 | "version": "2.3.3",
1664 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
1665 | "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
1666 | "requires": {
1667 | "punycode": "1.4.1"
1668 | }
1669 | },
1670 | "traverse": {
1671 | "version": "0.3.9",
1672 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
1673 | "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=",
1674 | "dev": true
1675 | },
1676 | "trim-newlines": {
1677 | "version": "1.0.0",
1678 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
1679 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM="
1680 | },
1681 | "truncate-utf8-bytes": {
1682 | "version": "1.0.2",
1683 | "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
1684 | "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=",
1685 | "dev": true,
1686 | "requires": {
1687 | "utf8-byte-length": "1.0.4"
1688 | }
1689 | },
1690 | "tunnel-agent": {
1691 | "version": "0.6.0",
1692 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1693 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1694 | "requires": {
1695 | "safe-buffer": "5.1.1"
1696 | }
1697 | },
1698 | "tweetnacl": {
1699 | "version": "0.14.5",
1700 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1701 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
1702 | "optional": true
1703 | },
1704 | "typedarray": {
1705 | "version": "0.0.6",
1706 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1707 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
1708 | },
1709 | "universalify": {
1710 | "version": "0.1.1",
1711 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
1712 | "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
1713 | "dev": true
1714 | },
1715 | "utf8-byte-length": {
1716 | "version": "1.0.4",
1717 | "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
1718 | "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=",
1719 | "dev": true
1720 | },
1721 | "util-deprecate": {
1722 | "version": "1.0.2",
1723 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1724 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1725 | },
1726 | "uuid": {
1727 | "version": "3.1.0",
1728 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
1729 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g=="
1730 | },
1731 | "validate-npm-package-license": {
1732 | "version": "3.0.1",
1733 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
1734 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
1735 | "requires": {
1736 | "spdx-correct": "1.0.2",
1737 | "spdx-expression-parse": "1.0.4"
1738 | }
1739 | },
1740 | "verror": {
1741 | "version": "1.10.0",
1742 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1743 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1744 | "requires": {
1745 | "assert-plus": "1.0.0",
1746 | "core-util-is": "1.0.2",
1747 | "extsprintf": "1.3.0"
1748 | }
1749 | },
1750 | "wrappy": {
1751 | "version": "1.0.2",
1752 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1753 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
1754 | },
1755 | "xmlbuilder": {
1756 | "version": "8.2.2",
1757 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
1758 | "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=",
1759 | "dev": true
1760 | },
1761 | "xmldom": {
1762 | "version": "0.1.27",
1763 | "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
1764 | "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=",
1765 | "dev": true
1766 | },
1767 | "xtend": {
1768 | "version": "2.1.2",
1769 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
1770 | "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
1771 | "requires": {
1772 | "object-keys": "0.4.0"
1773 | }
1774 | },
1775 | "yargs-parser": {
1776 | "version": "8.0.0",
1777 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.0.0.tgz",
1778 | "integrity": "sha1-IdR2Mw5agieaS4gTRb8GYQLiGcY=",
1779 | "dev": true,
1780 | "requires": {
1781 | "camelcase": "4.1.0"
1782 | },
1783 | "dependencies": {
1784 | "camelcase": {
1785 | "version": "4.1.0",
1786 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
1787 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
1788 | "dev": true
1789 | }
1790 | }
1791 | },
1792 | "yauzl": {
1793 | "version": "2.4.1",
1794 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
1795 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
1796 | "requires": {
1797 | "fd-slicer": "1.0.1"
1798 | }
1799 | }
1800 | }
1801 | }
1802 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "electron-screen-recorder",
3 | "description": "Screen Recorder",
4 | "version": "0.0.3",
5 | "author": "hokein",
6 | "license": "BSD",
7 | "keywords": [
8 | "Electron",
9 | "DesktopCapture",
10 | "Screen Recorder",
11 | "WebRTC"
12 | ],
13 | "scripts": {
14 | "build": "electron-packager ./src ElectronScreenRecorder --platform=darwin --arch=x64 --version=0.36.0 --icon=src/Icon.icns",
15 | "start": "electron ."
16 | },
17 | "main": "src/main.js",
18 | "bin": {
19 | "electron-screen-recorder": "./launch.js"
20 | },
21 | "devDependencies": {
22 | "electron-packager": "^10.1.0",
23 | "electron-prebuilt": "^1.4.13"
24 | },
25 | "dependencies": {
26 | "domify": "^1.4.0",
27 | "electron": "1.7.9"
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/screenshot/screen-recorder.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hokein/electron-screen-recorder/452c1c70983ef8e6363288376089403e5351977b/screenshot/screen-recorder.gif
--------------------------------------------------------------------------------
/src/IconTemplate.png:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | menubar/IconTemplate.png at master · matheuss/menubar
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
483 |
484 |
485 |
486 |
487 |
488 |
Permalink
489 |
490 |
491 |
492 |
493 |
494 |
918 |
919 |
928 |
931 |
932 |
933 |
934 |
935 |
936 | Fetching contributors…
937 |
938 |
939 |
940 |
941 |
Cannot retrieve contributors at this time
942 |
943 |
944 |
945 |
946 |
972 |
973 |
974 |
975 |
976 |
977 |
978 |
979 |
980 |
981 |
982 |
983 |
Jump to Line
984 |
989 |
990 |
991 |
992 |
993 |
994 |
995 |
996 |
997 |
998 |
999 |
1000 |
1025 |
1026 |
1027 |
1028 |
1029 |
1030 |
1031 |
1032 |
1033 | You can't perform that action at this time.
1034 |
1035 |
1036 |
1037 |
1038 |
1039 |
1040 |
1041 |
1042 |
1043 |
1044 |
1045 |
1046 |
1047 |
You signed in with another tab or window. Reload to refresh your session.
1048 |
You signed out in another tab or window. Reload to refresh your session.
1049 |
1050 |
1051 |
1058 |
1059 |
1060 |
1061 |
1062 |
1063 |
1064 |
--------------------------------------------------------------------------------
/src/app.js:
--------------------------------------------------------------------------------
1 | const {desktopCapturer, ipcRenderer, remote} = require('electron')
2 | const domify = require('domify')
3 |
4 | let localStream
5 | let microAudioStream
6 | let recordedChunks = []
7 | let numRecordedChunks = 0
8 | let recorder
9 | let includeMic = false
10 | // let includeSysAudio = false
11 |
12 | document.addEventListener('DOMContentLoaded', () => {
13 | document.querySelector('#record-desktop').addEventListener('click', recordDesktop)
14 | document.querySelector('#record-camera').addEventListener('click', recordCamera)
15 | document.querySelector('#record-window').addEventListener('click', recordWindow)
16 | document.querySelector('#play-video').addEventListener('click', playVideo)
17 | document.querySelector('#micro-audio').addEventListener('click', microAudioCheck)
18 | // document.querySelector('#system-audio').addEventListener('click', sysAudioCheck)
19 | document.querySelector('#record-stop').addEventListener('click', stopRecording)
20 | document.querySelector('#play-button').addEventListener('click', play)
21 | document.querySelector('#download-button').addEventListener('click', download)
22 | })
23 |
24 | const playVideo = () => {
25 | remote.dialog.showOpenDialog({properties: ['openFile']}, (filename) => {
26 | console.log(filename)
27 | let video = document.querySelector('video')
28 | video.muted = false
29 | video.src = filename
30 | })
31 | }
32 |
33 | const disableButtons = () => {
34 | document.querySelector('#record-desktop').disabled = true
35 | document.querySelector('#record-camera').disabled = true
36 | document.querySelector('#record-window').disabled = true
37 | document.querySelector('#record-stop').hidden = false
38 | document.querySelector('#play-button').hidden = true
39 | document.querySelector('#download-button').hidden = true
40 | }
41 |
42 | const enableButtons = () => {
43 | document.querySelector('#record-desktop').disabled = false
44 | document.querySelector('#record-camera').disabled = false
45 | document.querySelector('#record-window').disabled = false
46 | document.querySelector('#record-stop').hidden = true
47 | document.querySelector('#play-button').hidden = true
48 | document.querySelector('#download-button').hidden = true
49 | }
50 |
51 | const microAudioCheck = () => {
52 | // includeSysAudio = false
53 | // document.querySelector('#system-audio').checked = false
54 |
55 | // Mute video so we don't play loopback audio.
56 | var video = document.querySelector('video')
57 | video.muted = true
58 | includeMic = !includeMic
59 | if(includeMic)
60 | document.querySelector('#micro-audio-btn').classList.add('active');
61 | else
62 | document.querySelector('#micro-audio-btn').classList.remove('active');
63 | console.log('Audio =', includeMic)
64 |
65 | if (includeMic) {
66 | navigator.webkitGetUserMedia({ audio: true, video: false },
67 | getMicroAudio, getUserMediaError)
68 | }
69 | }
70 |
71 | // function sysAudioCheck () {
72 | // // Mute video so we don't play loopback audio
73 | // var video = document.querySelector('video')
74 | // video.muted = true
75 |
76 | // includeSysAudio = !includeSysAudio
77 | // includeMic = false
78 | // document.querySelector('#micro-audio').checked = false
79 | // console.log('System Audio =', includeSysAudio)
80 | // };
81 |
82 | const cleanRecord = () => {
83 | let video = document.querySelector('video');
84 | video.controls = false;
85 | recordedChunks = []
86 | numRecordedChunks = 0
87 | }
88 |
89 | ipcRenderer.on('source-id-selected', (event, sourceId) => {
90 | // Users have cancel the picker dialog.
91 | if (!sourceId) return
92 | console.log(sourceId)
93 | onAccessApproved(sourceId)
94 | })
95 |
96 | const recordDesktop = () => {
97 | cleanRecord()
98 | ipcRenderer.send('show-picker', { types: ['screen'] })
99 | }
100 |
101 | const recordWindow = () => {
102 | cleanRecord()
103 | ipcRenderer.send('show-picker', { types: ['window'] })
104 | }
105 |
106 | const recordCamera = () => {
107 | cleanRecord()
108 | navigator.webkitGetUserMedia({
109 | audio: false,
110 | video: { mandatory: { minWidth: 1280, minHeight: 720 } }
111 | }, getMediaStream, getUserMediaError)
112 | }
113 |
114 | const recorderOnDataAvailable = (event) => {
115 | if (event.data && event.data.size > 0) {
116 | recordedChunks.push(event.data)
117 | numRecordedChunks += event.data.byteLength
118 | }
119 | }
120 |
121 | const stopRecording = () => {
122 | console.log('Stopping record and starting download')
123 | enableButtons()
124 | document.querySelector('#play-button').hidden = false
125 | document.querySelector('#download-button').hidden = false
126 | recorder.stop()
127 | localStream.getVideoTracks()[0].stop()
128 | }
129 |
130 | const play = () => {
131 | // Unmute video.
132 | let video = document.querySelector('video')
133 | video.controls = true;
134 | video.muted = false
135 | let blob = new Blob(recordedChunks, {type: 'video/webm'})
136 | video.src = window.URL.createObjectURL(blob)
137 | }
138 |
139 | const download = () => {
140 | let blob = new Blob(recordedChunks, {type: 'video/webm'})
141 | let url = URL.createObjectURL(blob)
142 | let a = document.createElement('a')
143 | document.body.appendChild(a)
144 | a.style = 'display: none'
145 | a.href = url
146 | a.download = 'electron-screen-recorder.webm'
147 | a.click()
148 | setTimeout(function () {
149 | document.body.removeChild(a)
150 | window.URL.revokeObjectURL(url)
151 | }, 100)
152 | }
153 |
154 | const getMediaStream = (stream) => {
155 | let video = document.querySelector('video')
156 | video.src = URL.createObjectURL(stream)
157 | localStream = stream
158 | stream.onended = () => { console.log('Media stream ended.') }
159 |
160 | let videoTracks = localStream.getVideoTracks()
161 |
162 | if (includeMic) {
163 | console.log('Adding audio track.')
164 | let audioTracks = microAudioStream.getAudioTracks()
165 | localStream.addTrack(audioTracks[0])
166 | }
167 | // if (includeSysAudio) {
168 | // console.log('Adding system audio track.')
169 | // let audioTracks = stream.getoAudioTracks()
170 | // if (audioTracks.length < 1) {
171 | // console.log('No audio track in screen stream.')
172 | // }
173 | // } else {
174 | // console.log('Not adding audio track.')
175 | // }
176 | try {
177 | console.log('Start recording the stream.')
178 | recorder = new MediaRecorder(stream)
179 | } catch (e) {
180 | console.assert(false, 'Exception while creating MediaRecorder: ' + e)
181 | return
182 | }
183 | recorder.ondataavailable = recorderOnDataAvailable
184 | recorder.onstop = () => { console.log('recorderOnStop fired') }
185 | recorder.start()
186 | console.log('Recorder is started.')
187 | disableButtons()
188 | }
189 |
190 | const getMicroAudio = (stream) => {
191 | console.log('Received audio stream.')
192 | microAudioStream = stream
193 | stream.onended = () => { console.log('Micro audio ended.') }
194 | }
195 |
196 | const getUserMediaError = () => {
197 | console.log('getUserMedia() failed.')
198 | }
199 |
200 | const onAccessApproved = (id) => {
201 | if (!id) {
202 | console.log('Access rejected.')
203 | return
204 | }
205 | console.log('Window ID: ', id)
206 | navigator.webkitGetUserMedia({
207 | audio: false,
208 | video: { mandatory: { chromeMediaSource: 'desktop', chromeMediaSourceId: id,
209 | maxWidth: window.screen.width, maxHeight: window.screen.height } }
210 | }, getMediaStream, getUserMediaError)
211 | }
212 |
--------------------------------------------------------------------------------
/src/assets/fonts/themify.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hokein/electron-screen-recorder/452c1c70983ef8e6363288376089403e5351977b/src/assets/fonts/themify.eot
--------------------------------------------------------------------------------
/src/assets/fonts/themify.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hokein/electron-screen-recorder/452c1c70983ef8e6363288376089403e5351977b/src/assets/fonts/themify.ttf
--------------------------------------------------------------------------------
/src/assets/fonts/themify.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hokein/electron-screen-recorder/452c1c70983ef8e6363288376089403e5351977b/src/assets/fonts/themify.woff
--------------------------------------------------------------------------------
/src/assets/themify-icons.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'themify';
3 | src:url('fonts/themify.eot?-fvbane');
4 | src:url('fonts/themify.eot?#iefix-fvbane') format('embedded-opentype'),
5 | url('fonts/themify.woff?-fvbane') format('woff'),
6 | url('fonts/themify.ttf?-fvbane') format('truetype'),
7 | url('fonts/themify.svg?-fvbane#themify') format('svg');
8 | font-weight: normal;
9 | font-style: normal;
10 | }
11 |
12 | [class^="ti-"], [class*=" ti-"] {
13 | font-family: 'themify';
14 | speak: none;
15 | font-style: normal;
16 | font-weight: normal;
17 | font-variant: normal;
18 | text-transform: none;
19 | line-height: 1;
20 |
21 | /* Better Font Rendering =========== */
22 | -webkit-font-smoothing: antialiased;
23 | -moz-osx-font-smoothing: grayscale;
24 | }
25 |
26 | .ti-wand:before {
27 | content: "\e600";
28 | }
29 | .ti-volume:before {
30 | content: "\e601";
31 | }
32 | .ti-user:before {
33 | content: "\e602";
34 | }
35 | .ti-unlock:before {
36 | content: "\e603";
37 | }
38 | .ti-unlink:before {
39 | content: "\e604";
40 | }
41 | .ti-trash:before {
42 | content: "\e605";
43 | }
44 | .ti-thought:before {
45 | content: "\e606";
46 | }
47 | .ti-target:before {
48 | content: "\e607";
49 | }
50 | .ti-tag:before {
51 | content: "\e608";
52 | }
53 | .ti-tablet:before {
54 | content: "\e609";
55 | }
56 | .ti-star:before {
57 | content: "\e60a";
58 | }
59 | .ti-spray:before {
60 | content: "\e60b";
61 | }
62 | .ti-signal:before {
63 | content: "\e60c";
64 | }
65 | .ti-shopping-cart:before {
66 | content: "\e60d";
67 | }
68 | .ti-shopping-cart-full:before {
69 | content: "\e60e";
70 | }
71 | .ti-settings:before {
72 | content: "\e60f";
73 | }
74 | .ti-search:before {
75 | content: "\e610";
76 | }
77 | .ti-zoom-in:before {
78 | content: "\e611";
79 | }
80 | .ti-zoom-out:before {
81 | content: "\e612";
82 | }
83 | .ti-cut:before {
84 | content: "\e613";
85 | }
86 | .ti-ruler:before {
87 | content: "\e614";
88 | }
89 | .ti-ruler-pencil:before {
90 | content: "\e615";
91 | }
92 | .ti-ruler-alt:before {
93 | content: "\e616";
94 | }
95 | .ti-bookmark:before {
96 | content: "\e617";
97 | }
98 | .ti-bookmark-alt:before {
99 | content: "\e618";
100 | }
101 | .ti-reload:before {
102 | content: "\e619";
103 | }
104 | .ti-plus:before {
105 | content: "\e61a";
106 | }
107 | .ti-pin:before {
108 | content: "\e61b";
109 | }
110 | .ti-pencil:before {
111 | content: "\e61c";
112 | }
113 | .ti-pencil-alt:before {
114 | content: "\e61d";
115 | }
116 | .ti-paint-roller:before {
117 | content: "\e61e";
118 | }
119 | .ti-paint-bucket:before {
120 | content: "\e61f";
121 | }
122 | .ti-na:before {
123 | content: "\e620";
124 | }
125 | .ti-mobile:before {
126 | content: "\e621";
127 | }
128 | .ti-minus:before {
129 | content: "\e622";
130 | }
131 | .ti-medall:before {
132 | content: "\e623";
133 | }
134 | .ti-medall-alt:before {
135 | content: "\e624";
136 | }
137 | .ti-marker:before {
138 | content: "\e625";
139 | }
140 | .ti-marker-alt:before {
141 | content: "\e626";
142 | }
143 | .ti-arrow-up:before {
144 | content: "\e627";
145 | }
146 | .ti-arrow-right:before {
147 | content: "\e628";
148 | }
149 | .ti-arrow-left:before {
150 | content: "\e629";
151 | }
152 | .ti-arrow-down:before {
153 | content: "\e62a";
154 | }
155 | .ti-lock:before {
156 | content: "\e62b";
157 | }
158 | .ti-location-arrow:before {
159 | content: "\e62c";
160 | }
161 | .ti-link:before {
162 | content: "\e62d";
163 | }
164 | .ti-layout:before {
165 | content: "\e62e";
166 | }
167 | .ti-layers:before {
168 | content: "\e62f";
169 | }
170 | .ti-layers-alt:before {
171 | content: "\e630";
172 | }
173 | .ti-key:before {
174 | content: "\e631";
175 | }
176 | .ti-import:before {
177 | content: "\e632";
178 | }
179 | .ti-image:before {
180 | content: "\e633";
181 | }
182 | .ti-heart:before {
183 | content: "\e634";
184 | }
185 | .ti-heart-broken:before {
186 | content: "\e635";
187 | }
188 | .ti-hand-stop:before {
189 | content: "\e636";
190 | }
191 | .ti-hand-open:before {
192 | content: "\e637";
193 | }
194 | .ti-hand-drag:before {
195 | content: "\e638";
196 | }
197 | .ti-folder:before {
198 | content: "\e639";
199 | }
200 | .ti-flag:before {
201 | content: "\e63a";
202 | }
203 | .ti-flag-alt:before {
204 | content: "\e63b";
205 | }
206 | .ti-flag-alt-2:before {
207 | content: "\e63c";
208 | }
209 | .ti-eye:before {
210 | content: "\e63d";
211 | }
212 | .ti-export:before {
213 | content: "\e63e";
214 | }
215 | .ti-exchange-vertical:before {
216 | content: "\e63f";
217 | }
218 | .ti-desktop:before {
219 | content: "\e640";
220 | }
221 | .ti-cup:before {
222 | content: "\e641";
223 | }
224 | .ti-crown:before {
225 | content: "\e642";
226 | }
227 | .ti-comments:before {
228 | content: "\e643";
229 | }
230 | .ti-comment:before {
231 | content: "\e644";
232 | }
233 | .ti-comment-alt:before {
234 | content: "\e645";
235 | }
236 | .ti-close:before {
237 | content: "\e646";
238 | }
239 | .ti-clip:before {
240 | content: "\e647";
241 | }
242 | .ti-angle-up:before {
243 | content: "\e648";
244 | }
245 | .ti-angle-right:before {
246 | content: "\e649";
247 | }
248 | .ti-angle-left:before {
249 | content: "\e64a";
250 | }
251 | .ti-angle-down:before {
252 | content: "\e64b";
253 | }
254 | .ti-check:before {
255 | content: "\e64c";
256 | }
257 | .ti-check-box:before {
258 | content: "\e64d";
259 | }
260 | .ti-camera:before {
261 | content: "\e64e";
262 | }
263 | .ti-announcement:before {
264 | content: "\e64f";
265 | }
266 | .ti-brush:before {
267 | content: "\e650";
268 | }
269 | .ti-briefcase:before {
270 | content: "\e651";
271 | }
272 | .ti-bolt:before {
273 | content: "\e652";
274 | }
275 | .ti-bolt-alt:before {
276 | content: "\e653";
277 | }
278 | .ti-blackboard:before {
279 | content: "\e654";
280 | }
281 | .ti-bag:before {
282 | content: "\e655";
283 | }
284 | .ti-move:before {
285 | content: "\e656";
286 | }
287 | .ti-arrows-vertical:before {
288 | content: "\e657";
289 | }
290 | .ti-arrows-horizontal:before {
291 | content: "\e658";
292 | }
293 | .ti-fullscreen:before {
294 | content: "\e659";
295 | }
296 | .ti-arrow-top-right:before {
297 | content: "\e65a";
298 | }
299 | .ti-arrow-top-left:before {
300 | content: "\e65b";
301 | }
302 | .ti-arrow-circle-up:before {
303 | content: "\e65c";
304 | }
305 | .ti-arrow-circle-right:before {
306 | content: "\e65d";
307 | }
308 | .ti-arrow-circle-left:before {
309 | content: "\e65e";
310 | }
311 | .ti-arrow-circle-down:before {
312 | content: "\e65f";
313 | }
314 | .ti-angle-double-up:before {
315 | content: "\e660";
316 | }
317 | .ti-angle-double-right:before {
318 | content: "\e661";
319 | }
320 | .ti-angle-double-left:before {
321 | content: "\e662";
322 | }
323 | .ti-angle-double-down:before {
324 | content: "\e663";
325 | }
326 | .ti-zip:before {
327 | content: "\e664";
328 | }
329 | .ti-world:before {
330 | content: "\e665";
331 | }
332 | .ti-wheelchair:before {
333 | content: "\e666";
334 | }
335 | .ti-view-list:before {
336 | content: "\e667";
337 | }
338 | .ti-view-list-alt:before {
339 | content: "\e668";
340 | }
341 | .ti-view-grid:before {
342 | content: "\e669";
343 | }
344 | .ti-uppercase:before {
345 | content: "\e66a";
346 | }
347 | .ti-upload:before {
348 | content: "\e66b";
349 | }
350 | .ti-underline:before {
351 | content: "\e66c";
352 | }
353 | .ti-truck:before {
354 | content: "\e66d";
355 | }
356 | .ti-timer:before {
357 | content: "\e66e";
358 | }
359 | .ti-ticket:before {
360 | content: "\e66f";
361 | }
362 | .ti-thumb-up:before {
363 | content: "\e670";
364 | }
365 | .ti-thumb-down:before {
366 | content: "\e671";
367 | }
368 | .ti-text:before {
369 | content: "\e672";
370 | }
371 | .ti-stats-up:before {
372 | content: "\e673";
373 | }
374 | .ti-stats-down:before {
375 | content: "\e674";
376 | }
377 | .ti-split-v:before {
378 | content: "\e675";
379 | }
380 | .ti-split-h:before {
381 | content: "\e676";
382 | }
383 | .ti-smallcap:before {
384 | content: "\e677";
385 | }
386 | .ti-shine:before {
387 | content: "\e678";
388 | }
389 | .ti-shift-right:before {
390 | content: "\e679";
391 | }
392 | .ti-shift-left:before {
393 | content: "\e67a";
394 | }
395 | .ti-shield:before {
396 | content: "\e67b";
397 | }
398 | .ti-notepad:before {
399 | content: "\e67c";
400 | }
401 | .ti-server:before {
402 | content: "\e67d";
403 | }
404 | .ti-quote-right:before {
405 | content: "\e67e";
406 | }
407 | .ti-quote-left:before {
408 | content: "\e67f";
409 | }
410 | .ti-pulse:before {
411 | content: "\e680";
412 | }
413 | .ti-printer:before {
414 | content: "\e681";
415 | }
416 | .ti-power-off:before {
417 | content: "\e682";
418 | }
419 | .ti-plug:before {
420 | content: "\e683";
421 | }
422 | .ti-pie-chart:before {
423 | content: "\e684";
424 | }
425 | .ti-paragraph:before {
426 | content: "\e685";
427 | }
428 | .ti-panel:before {
429 | content: "\e686";
430 | }
431 | .ti-package:before {
432 | content: "\e687";
433 | }
434 | .ti-music:before {
435 | content: "\e688";
436 | }
437 | .ti-music-alt:before {
438 | content: "\e689";
439 | }
440 | .ti-mouse:before {
441 | content: "\e68a";
442 | }
443 | .ti-mouse-alt:before {
444 | content: "\e68b";
445 | }
446 | .ti-money:before {
447 | content: "\e68c";
448 | }
449 | .ti-microphone:before {
450 | content: "\e68d";
451 | }
452 | .ti-menu:before {
453 | content: "\e68e";
454 | }
455 | .ti-menu-alt:before {
456 | content: "\e68f";
457 | }
458 | .ti-map:before {
459 | content: "\e690";
460 | }
461 | .ti-map-alt:before {
462 | content: "\e691";
463 | }
464 | .ti-loop:before {
465 | content: "\e692";
466 | }
467 | .ti-location-pin:before {
468 | content: "\e693";
469 | }
470 | .ti-list:before {
471 | content: "\e694";
472 | }
473 | .ti-light-bulb:before {
474 | content: "\e695";
475 | }
476 | .ti-Italic:before {
477 | content: "\e696";
478 | }
479 | .ti-info:before {
480 | content: "\e697";
481 | }
482 | .ti-infinite:before {
483 | content: "\e698";
484 | }
485 | .ti-id-badge:before {
486 | content: "\e699";
487 | }
488 | .ti-hummer:before {
489 | content: "\e69a";
490 | }
491 | .ti-home:before {
492 | content: "\e69b";
493 | }
494 | .ti-help:before {
495 | content: "\e69c";
496 | }
497 | .ti-headphone:before {
498 | content: "\e69d";
499 | }
500 | .ti-harddrives:before {
501 | content: "\e69e";
502 | }
503 | .ti-harddrive:before {
504 | content: "\e69f";
505 | }
506 | .ti-gift:before {
507 | content: "\e6a0";
508 | }
509 | .ti-game:before {
510 | content: "\e6a1";
511 | }
512 | .ti-filter:before {
513 | content: "\e6a2";
514 | }
515 | .ti-files:before {
516 | content: "\e6a3";
517 | }
518 | .ti-file:before {
519 | content: "\e6a4";
520 | }
521 | .ti-eraser:before {
522 | content: "\e6a5";
523 | }
524 | .ti-envelope:before {
525 | content: "\e6a6";
526 | }
527 | .ti-download:before {
528 | content: "\e6a7";
529 | }
530 | .ti-direction:before {
531 | content: "\e6a8";
532 | }
533 | .ti-direction-alt:before {
534 | content: "\e6a9";
535 | }
536 | .ti-dashboard:before {
537 | content: "\e6aa";
538 | }
539 | .ti-control-stop:before {
540 | content: "\e6ab";
541 | }
542 | .ti-control-shuffle:before {
543 | content: "\e6ac";
544 | }
545 | .ti-control-play:before {
546 | content: "\e6ad";
547 | }
548 | .ti-control-pause:before {
549 | content: "\e6ae";
550 | }
551 | .ti-control-forward:before {
552 | content: "\e6af";
553 | }
554 | .ti-control-backward:before {
555 | content: "\e6b0";
556 | }
557 | .ti-cloud:before {
558 | content: "\e6b1";
559 | }
560 | .ti-cloud-up:before {
561 | content: "\e6b2";
562 | }
563 | .ti-cloud-down:before {
564 | content: "\e6b3";
565 | }
566 | .ti-clipboard:before {
567 | content: "\e6b4";
568 | }
569 | .ti-car:before {
570 | content: "\e6b5";
571 | }
572 | .ti-calendar:before {
573 | content: "\e6b6";
574 | }
575 | .ti-book:before {
576 | content: "\e6b7";
577 | }
578 | .ti-bell:before {
579 | content: "\e6b8";
580 | }
581 | .ti-basketball:before {
582 | content: "\e6b9";
583 | }
584 | .ti-bar-chart:before {
585 | content: "\e6ba";
586 | }
587 | .ti-bar-chart-alt:before {
588 | content: "\e6bb";
589 | }
590 | .ti-back-right:before {
591 | content: "\e6bc";
592 | }
593 | .ti-back-left:before {
594 | content: "\e6bd";
595 | }
596 | .ti-arrows-corner:before {
597 | content: "\e6be";
598 | }
599 | .ti-archive:before {
600 | content: "\e6bf";
601 | }
602 | .ti-anchor:before {
603 | content: "\e6c0";
604 | }
605 | .ti-align-right:before {
606 | content: "\e6c1";
607 | }
608 | .ti-align-left:before {
609 | content: "\e6c2";
610 | }
611 | .ti-align-justify:before {
612 | content: "\e6c3";
613 | }
614 | .ti-align-center:before {
615 | content: "\e6c4";
616 | }
617 | .ti-alert:before {
618 | content: "\e6c5";
619 | }
620 | .ti-alarm-clock:before {
621 | content: "\e6c6";
622 | }
623 | .ti-agenda:before {
624 | content: "\e6c7";
625 | }
626 | .ti-write:before {
627 | content: "\e6c8";
628 | }
629 | .ti-window:before {
630 | content: "\e6c9";
631 | }
632 | .ti-widgetized:before {
633 | content: "\e6ca";
634 | }
635 | .ti-widget:before {
636 | content: "\e6cb";
637 | }
638 | .ti-widget-alt:before {
639 | content: "\e6cc";
640 | }
641 | .ti-wallet:before {
642 | content: "\e6cd";
643 | }
644 | .ti-video-clapper:before {
645 | content: "\e6ce";
646 | }
647 | .ti-video-camera:before {
648 | content: "\e6cf";
649 | }
650 | .ti-vector:before {
651 | content: "\e6d0";
652 | }
653 | .ti-themify-logo:before {
654 | content: "\e6d1";
655 | }
656 | .ti-themify-favicon:before {
657 | content: "\e6d2";
658 | }
659 | .ti-themify-favicon-alt:before {
660 | content: "\e6d3";
661 | }
662 | .ti-support:before {
663 | content: "\e6d4";
664 | }
665 | .ti-stamp:before {
666 | content: "\e6d5";
667 | }
668 | .ti-split-v-alt:before {
669 | content: "\e6d6";
670 | }
671 | .ti-slice:before {
672 | content: "\e6d7";
673 | }
674 | .ti-shortcode:before {
675 | content: "\e6d8";
676 | }
677 | .ti-shift-right-alt:before {
678 | content: "\e6d9";
679 | }
680 | .ti-shift-left-alt:before {
681 | content: "\e6da";
682 | }
683 | .ti-ruler-alt-2:before {
684 | content: "\e6db";
685 | }
686 | .ti-receipt:before {
687 | content: "\e6dc";
688 | }
689 | .ti-pin2:before {
690 | content: "\e6dd";
691 | }
692 | .ti-pin-alt:before {
693 | content: "\e6de";
694 | }
695 | .ti-pencil-alt2:before {
696 | content: "\e6df";
697 | }
698 | .ti-palette:before {
699 | content: "\e6e0";
700 | }
701 | .ti-more:before {
702 | content: "\e6e1";
703 | }
704 | .ti-more-alt:before {
705 | content: "\e6e2";
706 | }
707 | .ti-microphone-alt:before {
708 | content: "\e6e3";
709 | }
710 | .ti-magnet:before {
711 | content: "\e6e4";
712 | }
713 | .ti-line-double:before {
714 | content: "\e6e5";
715 | }
716 | .ti-line-dotted:before {
717 | content: "\e6e6";
718 | }
719 | .ti-line-dashed:before {
720 | content: "\e6e7";
721 | }
722 | .ti-layout-width-full:before {
723 | content: "\e6e8";
724 | }
725 | .ti-layout-width-default:before {
726 | content: "\e6e9";
727 | }
728 | .ti-layout-width-default-alt:before {
729 | content: "\e6ea";
730 | }
731 | .ti-layout-tab:before {
732 | content: "\e6eb";
733 | }
734 | .ti-layout-tab-window:before {
735 | content: "\e6ec";
736 | }
737 | .ti-layout-tab-v:before {
738 | content: "\e6ed";
739 | }
740 | .ti-layout-tab-min:before {
741 | content: "\e6ee";
742 | }
743 | .ti-layout-slider:before {
744 | content: "\e6ef";
745 | }
746 | .ti-layout-slider-alt:before {
747 | content: "\e6f0";
748 | }
749 | .ti-layout-sidebar-right:before {
750 | content: "\e6f1";
751 | }
752 | .ti-layout-sidebar-none:before {
753 | content: "\e6f2";
754 | }
755 | .ti-layout-sidebar-left:before {
756 | content: "\e6f3";
757 | }
758 | .ti-layout-placeholder:before {
759 | content: "\e6f4";
760 | }
761 | .ti-layout-menu:before {
762 | content: "\e6f5";
763 | }
764 | .ti-layout-menu-v:before {
765 | content: "\e6f6";
766 | }
767 | .ti-layout-menu-separated:before {
768 | content: "\e6f7";
769 | }
770 | .ti-layout-menu-full:before {
771 | content: "\e6f8";
772 | }
773 | .ti-layout-media-right-alt:before {
774 | content: "\e6f9";
775 | }
776 | .ti-layout-media-right:before {
777 | content: "\e6fa";
778 | }
779 | .ti-layout-media-overlay:before {
780 | content: "\e6fb";
781 | }
782 | .ti-layout-media-overlay-alt:before {
783 | content: "\e6fc";
784 | }
785 | .ti-layout-media-overlay-alt-2:before {
786 | content: "\e6fd";
787 | }
788 | .ti-layout-media-left-alt:before {
789 | content: "\e6fe";
790 | }
791 | .ti-layout-media-left:before {
792 | content: "\e6ff";
793 | }
794 | .ti-layout-media-center-alt:before {
795 | content: "\e700";
796 | }
797 | .ti-layout-media-center:before {
798 | content: "\e701";
799 | }
800 | .ti-layout-list-thumb:before {
801 | content: "\e702";
802 | }
803 | .ti-layout-list-thumb-alt:before {
804 | content: "\e703";
805 | }
806 | .ti-layout-list-post:before {
807 | content: "\e704";
808 | }
809 | .ti-layout-list-large-image:before {
810 | content: "\e705";
811 | }
812 | .ti-layout-line-solid:before {
813 | content: "\e706";
814 | }
815 | .ti-layout-grid4:before {
816 | content: "\e707";
817 | }
818 | .ti-layout-grid3:before {
819 | content: "\e708";
820 | }
821 | .ti-layout-grid2:before {
822 | content: "\e709";
823 | }
824 | .ti-layout-grid2-thumb:before {
825 | content: "\e70a";
826 | }
827 | .ti-layout-cta-right:before {
828 | content: "\e70b";
829 | }
830 | .ti-layout-cta-left:before {
831 | content: "\e70c";
832 | }
833 | .ti-layout-cta-center:before {
834 | content: "\e70d";
835 | }
836 | .ti-layout-cta-btn-right:before {
837 | content: "\e70e";
838 | }
839 | .ti-layout-cta-btn-left:before {
840 | content: "\e70f";
841 | }
842 | .ti-layout-column4:before {
843 | content: "\e710";
844 | }
845 | .ti-layout-column3:before {
846 | content: "\e711";
847 | }
848 | .ti-layout-column2:before {
849 | content: "\e712";
850 | }
851 | .ti-layout-accordion-separated:before {
852 | content: "\e713";
853 | }
854 | .ti-layout-accordion-merged:before {
855 | content: "\e714";
856 | }
857 | .ti-layout-accordion-list:before {
858 | content: "\e715";
859 | }
860 | .ti-ink-pen:before {
861 | content: "\e716";
862 | }
863 | .ti-info-alt:before {
864 | content: "\e717";
865 | }
866 | .ti-help-alt:before {
867 | content: "\e718";
868 | }
869 | .ti-headphone-alt:before {
870 | content: "\e719";
871 | }
872 | .ti-hand-point-up:before {
873 | content: "\e71a";
874 | }
875 | .ti-hand-point-right:before {
876 | content: "\e71b";
877 | }
878 | .ti-hand-point-left:before {
879 | content: "\e71c";
880 | }
881 | .ti-hand-point-down:before {
882 | content: "\e71d";
883 | }
884 | .ti-gallery:before {
885 | content: "\e71e";
886 | }
887 | .ti-face-smile:before {
888 | content: "\e71f";
889 | }
890 | .ti-face-sad:before {
891 | content: "\e720";
892 | }
893 | .ti-credit-card:before {
894 | content: "\e721";
895 | }
896 | .ti-control-skip-forward:before {
897 | content: "\e722";
898 | }
899 | .ti-control-skip-backward:before {
900 | content: "\e723";
901 | }
902 | .ti-control-record:before {
903 | content: "\e724";
904 | }
905 | .ti-control-eject:before {
906 | content: "\e725";
907 | }
908 | .ti-comments-smiley:before {
909 | content: "\e726";
910 | }
911 | .ti-brush-alt:before {
912 | content: "\e727";
913 | }
914 | .ti-youtube:before {
915 | content: "\e728";
916 | }
917 | .ti-vimeo:before {
918 | content: "\e729";
919 | }
920 | .ti-twitter:before {
921 | content: "\e72a";
922 | }
923 | .ti-time:before {
924 | content: "\e72b";
925 | }
926 | .ti-tumblr:before {
927 | content: "\e72c";
928 | }
929 | .ti-skype:before {
930 | content: "\e72d";
931 | }
932 | .ti-share:before {
933 | content: "\e72e";
934 | }
935 | .ti-share-alt:before {
936 | content: "\e72f";
937 | }
938 | .ti-rocket:before {
939 | content: "\e730";
940 | }
941 | .ti-pinterest:before {
942 | content: "\e731";
943 | }
944 | .ti-new-window:before {
945 | content: "\e732";
946 | }
947 | .ti-microsoft:before {
948 | content: "\e733";
949 | }
950 | .ti-list-ol:before {
951 | content: "\e734";
952 | }
953 | .ti-linkedin:before {
954 | content: "\e735";
955 | }
956 | .ti-layout-sidebar-2:before {
957 | content: "\e736";
958 | }
959 | .ti-layout-grid4-alt:before {
960 | content: "\e737";
961 | }
962 | .ti-layout-grid3-alt:before {
963 | content: "\e738";
964 | }
965 | .ti-layout-grid2-alt:before {
966 | content: "\e739";
967 | }
968 | .ti-layout-column4-alt:before {
969 | content: "\e73a";
970 | }
971 | .ti-layout-column3-alt:before {
972 | content: "\e73b";
973 | }
974 | .ti-layout-column2-alt:before {
975 | content: "\e73c";
976 | }
977 | .ti-instagram:before {
978 | content: "\e73d";
979 | }
980 | .ti-google:before {
981 | content: "\e73e";
982 | }
983 | .ti-github:before {
984 | content: "\e73f";
985 | }
986 | .ti-flickr:before {
987 | content: "\e740";
988 | }
989 | .ti-facebook:before {
990 | content: "\e741";
991 | }
992 | .ti-dropbox:before {
993 | content: "\e742";
994 | }
995 | .ti-dribbble:before {
996 | content: "\e743";
997 | }
998 | .ti-apple:before {
999 | content: "\e744";
1000 | }
1001 | .ti-android:before {
1002 | content: "\e745";
1003 | }
1004 | .ti-save:before {
1005 | content: "\e746";
1006 | }
1007 | .ti-save-alt:before {
1008 | content: "\e747";
1009 | }
1010 | .ti-yahoo:before {
1011 | content: "\e748";
1012 | }
1013 | .ti-wordpress:before {
1014 | content: "\e749";
1015 | }
1016 | .ti-vimeo-alt:before {
1017 | content: "\e74a";
1018 | }
1019 | .ti-twitter-alt:before {
1020 | content: "\e74b";
1021 | }
1022 | .ti-tumblr-alt:before {
1023 | content: "\e74c";
1024 | }
1025 | .ti-trello:before {
1026 | content: "\e74d";
1027 | }
1028 | .ti-stack-overflow:before {
1029 | content: "\e74e";
1030 | }
1031 | .ti-soundcloud:before {
1032 | content: "\e74f";
1033 | }
1034 | .ti-sharethis:before {
1035 | content: "\e750";
1036 | }
1037 | .ti-sharethis-alt:before {
1038 | content: "\e751";
1039 | }
1040 | .ti-reddit:before {
1041 | content: "\e752";
1042 | }
1043 | .ti-pinterest-alt:before {
1044 | content: "\e753";
1045 | }
1046 | .ti-microsoft-alt:before {
1047 | content: "\e754";
1048 | }
1049 | .ti-linux:before {
1050 | content: "\e755";
1051 | }
1052 | .ti-jsfiddle:before {
1053 | content: "\e756";
1054 | }
1055 | .ti-joomla:before {
1056 | content: "\e757";
1057 | }
1058 | .ti-html5:before {
1059 | content: "\e758";
1060 | }
1061 | .ti-flickr-alt:before {
1062 | content: "\e759";
1063 | }
1064 | .ti-email:before {
1065 | content: "\e75a";
1066 | }
1067 | .ti-drupal:before {
1068 | content: "\e75b";
1069 | }
1070 | .ti-dropbox-alt:before {
1071 | content: "\e75c";
1072 | }
1073 | .ti-css3:before {
1074 | content: "\e75d";
1075 | }
1076 | .ti-rss:before {
1077 | content: "\e75e";
1078 | }
1079 | .ti-rss-alt:before {
1080 | content: "\e75f";
1081 | }
1082 |
--------------------------------------------------------------------------------
/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Electron Screen Recorder
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | const {app, BrowserWindow, ipcMain} = require('electron')
2 |
3 | let mainWindow
4 | let pickerDialog
5 |
6 | app.on('ready', () => {
7 | mainWindow = new BrowserWindow({
8 | height: 500,
9 | width: 600
10 | });
11 |
12 | pickerDialog = new BrowserWindow({
13 | parent: mainWindow,
14 | skipTaskbar: true,
15 | modal: true,
16 | show: false,
17 | height: 390,
18 | width: 680
19 | })
20 | mainWindow.loadURL('file://' + __dirname + '/index.html')
21 | pickerDialog.loadURL('file://' + __dirname + '/picker.html')
22 | });
23 |
24 | ipcMain.on('show-picker', (event, options) => {
25 | pickerDialog.show()
26 | pickerDialog.webContents.send('get-sources', options)
27 | })
28 |
29 | ipcMain.on('source-id-selected', (event, sourceId) => {
30 | pickerDialog.hide()
31 | mainWindow.webContents.send('source-id-selected', sourceId)
32 | })
33 |
--------------------------------------------------------------------------------
/src/picker.css:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: #ffffff;
3 | color: #37474f;
4 | font-family: monospace;
5 | padding:15px;
6 | display: -webkit-flex;
7 | -webkit-justify-content: center;
8 | -webkit-align-items: center;
9 | -webkit-flex-direction: column;
10 | }
11 |
12 | .row {
13 | display:block;
14 | width:100%;
15 | text-align: center;
16 | }
17 |
18 | .capturer-list li {
19 | list-style-type: none;
20 | margin-right: 30px;
21 | float: left;
22 | padding: 10px;
23 | border: 2px solid #F7F7F7;
24 | margin: 10px;
25 | /*height: 150px;*/
26 | }
27 |
28 | .capturer-list li a {
29 | text-decoration:none;
30 | }
31 |
32 | .capturer-list img {
33 | border: 1px solid #F7F7F7;
34 | height: 98px;
35 | width: 150px;
36 | }
37 |
38 | .capturer-list li:hover {
39 | border-color: #666666;
40 | }
41 |
42 | .capturer-list span {
43 | color: #37474f;
44 | display: block;
45 | }
46 |
47 | .cr ul {
48 | padding:0;
49 | }
--------------------------------------------------------------------------------
/src/picker.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Electron Screen Recorder
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
Select the window you want to share:
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/picker.js:
--------------------------------------------------------------------------------
1 | const {desktopCapturer, ipcRenderer} = require('electron')
2 | const domify = require('domify')
3 |
4 | document.onkeydown = function (evt) {
5 | evt = evt || window.event
6 | // Press esc key.
7 | if (evt.keyCode === 27) {
8 | ipcRenderer.send('source-id-selected', null)
9 | }
10 | }
11 |
12 | ipcRenderer.on('get-sources', (event, options) => {
13 | desktopCapturer.getSources(options, (error, sources) => {
14 | if (error) throw error
15 | let sourcesList = document.querySelector('.capturer-list')
16 | for (let source of sources) {
17 | let thumb = source.thumbnail.toDataURL()
18 | if (!thumb) continue
19 | let title = source.name.slice(0, 20)
20 | let item = `${title} `
21 | sourcesList.appendChild(domify(item))
22 | }
23 | let links = sourcesList.querySelectorAll('a')
24 | for (let i = 0; i < links.length; ++i) {
25 | let closure = (i) => {
26 | return (e) => {
27 | e.preventDefault()
28 | ipcRenderer.send('source-id-selected', sources[i].id)
29 | sourcesList.innerHTML = ''
30 | }
31 | }
32 | links[i].onclick = closure(i)
33 | }
34 | })
35 | })
36 |
--------------------------------------------------------------------------------
/src/screen-recorder.css:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: #ffffff;
3 | color: #37474f;
4 | font-family: monospace;
5 | padding:15px;
6 | display: -webkit-flex;
7 | -webkit-justify-content: center;
8 | -webkit-align-items: center;
9 | -webkit-flex-direction: column;
10 | }
11 |
12 | .row {
13 | display:block;
14 | width:100%;
15 | text-align: center;
16 | }
17 | .ck-button {
18 | display:inline-block;
19 | }
20 |
21 | .ck-button, button {
22 | overflow:auto;
23 | color: #37474f;
24 | border-color: #37474f;
25 | border: 1px solid;
26 | /* border-radius: 5px; */
27 | max-width: 50px;
28 | max-height: 50px;
29 | padding: 10px;
30 | background: #fff;
31 | vertical-align: middle;
32 | position: relative;
33 | z-index: 1;
34 | font-size: 20px;
35 | -webkit-backface-visibility: hidden;
36 | -moz-osx-font-smoothing: grayscale;
37 | }
38 |
39 | .ck-button:hover, button:hover {
40 | background-color: #F7F7F7;
41 | }
42 |
43 | .ck-button input {
44 | position:absolute;
45 | top: -20px;
46 | }
47 |
48 | .ck-button.active {
49 | color: #29759b;
50 | border-color: #29759b;
51 | background-color: #d7f2ff;
52 | }
53 |
54 | video {
55 | width:100%;
56 | border: 1px solid #37474f;
57 | }
58 |
--------------------------------------------------------------------------------