├── .editorconfig
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── index.js
├── package-lock.json
├── package.json
└── src
├── gui
├── .babelrc
├── components
│ └── main.js
├── constants
│ └── index.js
├── index.js
├── lib
│ └── index.js
├── package-lock.json
└── package.json
└── lib
├── convertImage.js
├── downloadFile.js
└── index.js
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig helps developers define and maintain consistent
2 | # coding styles between different editors and IDEs
3 | # editorconfig.org
4 |
5 | root = true
6 |
7 |
8 | [*]
9 |
10 | # Change these settings to your own preference
11 | indent_style = space
12 | indent_size = 2
13 |
14 | # We recommend you to keep these unchanged
15 | end_of_line = lf
16 | charset = utf-8
17 | trim_trailing_whitespace = true
18 | insert_final_newline = true
19 |
20 | [*.md]
21 | trim_trailing_whitespace = false
22 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | bin/
2 | dist/
3 | build/
4 |
5 | # Logs
6 | logs
7 | *.log
8 | npm-debug.log*
9 | yarn-debug.log*
10 | yarn-error.log*
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 |
24 | # nyc test coverage
25 | .nyc_output
26 |
27 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
28 | .grunt
29 | .wwp-cache
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # Typescript v1 declaration files
45 | typings/
46 |
47 | # Optional npm cache directory
48 | .npm
49 |
50 | # Optional eslint cache
51 | .eslintcache
52 |
53 | # Optional REPL history
54 | .node_repl_history
55 |
56 | # Output of 'npm pack'
57 | *.tgz
58 |
59 | # Yarn Integrity file
60 | .yarn-integrity
61 |
62 | # dotenv environment variables file
63 | .env
64 |
65 |
66 | *~
67 |
68 | # temporary files which can be created if a process still has a handle open of a deleted file
69 | .fuse_hidden*
70 |
71 | # KDE directory preferences
72 | .directory
73 |
74 | # Linux trash folder which might appear on any partition or disk
75 | .Trash-*
76 |
77 | # .nfs files are created when an open file is removed but is still being accessed
78 | .nfs*
79 |
80 | # Windows thumbnail cache files
81 | Thumbs.db
82 | ehthumbs.db
83 | ehthumbs_vista.db
84 |
85 | # Dump file
86 | *.stackdump
87 |
88 | # Folder config file
89 | [Dd]esktop.ini
90 |
91 | # Recycle Bin used on file shares
92 | $RECYCLE.BIN/
93 |
94 | # Windows Installer files
95 | *.cab
96 | *.msi
97 | *.msm
98 | *.msp
99 |
100 | # Windows shortcuts
101 | *.lnk
102 |
103 | # General
104 | .DS_Store
105 | .AppleDouble
106 | .LSOverride
107 |
108 | # Icon must end with two \r
109 | Icon
110 |
111 |
112 | # Thumbnails
113 | ._*
114 |
115 | # Files that might appear in the root of a volume
116 | .DocumentRevisions-V100
117 | .fseventsd
118 | .Spotlight-V100
119 | .TemporaryItems
120 | .Trashes
121 | .VolumeIcon.icns
122 | .com.apple.timemachine.donotpresent
123 |
124 | # Directories potentially created on remote AFP share
125 | .AppleDB
126 | .AppleDesktop
127 | Network Trash Folder
128 | Temporary Items
129 | .apdisk
130 |
131 | # Cache files for Sublime Text
132 | *.tmlanguage.cache
133 | *.tmPreferences.cache
134 | *.stTheme.cache
135 |
136 | # Workspace files are user-specific
137 | *.sublime-workspace
138 |
139 | # Project files should be checked into the repository, unless a significant
140 | # proportion of contributors will probably not be using Sublime Text
141 | # *.sublime-project
142 |
143 | # SFTP configuration file
144 | sftp-config.json
145 |
146 | # Package control specific files
147 | Package Control.last-run
148 | Package Control.ca-list
149 | Package Control.ca-bundle
150 | Package Control.system-ca-bundle
151 | Package Control.cache/
152 | Package Control.ca-certs/
153 | Package Control.merged-ca-bundle
154 | Package Control.user-ca-bundle
155 | oscrypto-ca-bundle.crt
156 | bh_unicode_properties.cache
157 |
158 | # Sublime-github package stores a github token in this file
159 | # https://packagecontrol.io/packages/sublime-github
160 | GitHub.sublime-settings
161 |
162 | .vscode/*
163 | !.vscode/settings.json
164 | !.vscode/tasks.json
165 | !.vscode/launch.json
166 | !.vscode/extensions.json
167 |
168 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
169 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
170 |
171 | # User-specific stuff:
172 | .idea/**/workspace.xml
173 | .idea/**/tasks.xml
174 | .idea/dictionaries
175 |
176 | # Sensitive or high-churn files:
177 | .idea/**/dataSources/
178 | .idea/**/dataSources.ids
179 | .idea/**/dataSources.xml
180 | .idea/**/dataSources.local.xml
181 | .idea/**/sqlDataSources.xml
182 | .idea/**/dynamic.xml
183 | .idea/**/uiDesigner.xml
184 |
185 | # Gradle:
186 | .idea/**/gradle.xml
187 | .idea/**/libraries
188 |
189 | # CMake
190 | cmake-build-debug/
191 | cmake-build-release/
192 |
193 | # Mongo Explorer plugin:
194 | .idea/**/mongoSettings.xml
195 |
196 | ## File-based project format:
197 | *.iws
198 |
199 | ## Plugin-specific files:
200 |
201 | # IntelliJ
202 | out/
203 |
204 | # mpeltonen/sbt-idea plugin
205 | .idea_modules/
206 |
207 | # JIRA plugin
208 | atlassian-ide-plugin.xml
209 |
210 | # Cursive Clojure plugin
211 | .idea/replstate.xml
212 |
213 | # Crashlytics plugin (for Android Studio and IntelliJ)
214 | com_crashlytics_export_strings.xml
215 | crashlytics.properties
216 | crashlytics-build.properties
217 | fabric.properties
218 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 | When contributing to this repository, please first discuss the change you wish to make via issue, email before making any change.
3 | Please note we have a code of conduct, please follow it in all your interactions with the project.
4 |
5 | # Pull Request Process
6 | 1.Ensure any install or build dependencies are removed before the end of the layer when doing a build.
7 |
8 | 2.Update the README.md with details of changes to the interface, this includes new environment variables, exposed ports, useful file locations and container parameters.
9 |
10 | 3.Increase the version numbers in any examples files and the README.md to the new version that this Pull Request would represent. The versioning scheme we use is SemVer.
11 |
12 | 4.You may merge the Pull Request in once you have the sign-off of two other developers, or if you do not have permission to do that, you may request the second reviewer to merge it for you.
13 |
14 | ## Code of Conduct
15 |
16 | ### Our Pledge
17 |
18 | In the interest of fostering an open and welcoming environment, we as
19 | contributors and maintainers pledge to making participation in our project and
20 | our community a harassment-free experience for everyone, regardless of age, body
21 | size, disability, ethnicity, gender identity and expression, level of experience,
22 | nationality, personal appearance, race, religion, or sexual identity and
23 | orientation.
24 |
25 | ### Our Standards
26 |
27 | Examples of behavior that contributes to creating a positive environment
28 | include:
29 |
30 | * Using welcoming and inclusive language
31 | * Being respectful of differing viewpoints and experiences
32 | * Gracefully accepting constructive criticism
33 | * Focusing on what is best for the community
34 | * Showing empathy towards other community members
35 |
36 | Examples of unacceptable behavior by participants include:
37 |
38 | * The use of sexualized language or imagery and unwelcome sexual attention or
39 | advances
40 | * Trolling, insulting/derogatory comments, and personal or political attacks
41 | * Public or private harassment
42 | * Publishing others' private information, such as a physical or electronic
43 | address, without explicit permission
44 | * Other conduct which could reasonably be considered inappropriate in a
45 | professional setting
46 |
47 | ### Our Responsibilities
48 |
49 | Project maintainers are responsible for clarifying the standards of acceptable
50 | behavior and are expected to take appropriate and fair corrective action in
51 | response to any instances of unacceptable behavior.
52 |
53 | Project maintainers have the right and responsibility to remove, edit, or
54 | reject comments, commits, code, wiki edits, issues, and other contributions
55 | that are not aligned to this Code of Conduct, or to ban temporarily or
56 | permanently any contributor for other behaviors that they deem inappropriate,
57 | threatening, offensive, or harmful.
58 |
59 | ### Scope
60 |
61 | This Code of Conduct applies both within project spaces and in public spaces
62 | when an individual is representing the project or its community. Examples of
63 | representing a project or community include using an official project e-mail
64 | address, posting via an official social media account, or acting as an appointed
65 | representative at an online or offline event. Representation of a project may be
66 | further defined and clarified by project maintainers.
67 |
68 | ### Enforcement
69 |
70 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
71 | reported by contacting the project team at laisibizness@gmail.com. All
72 | complaints will be reviewed and investigated and will result in a response that
73 | is deemed necessary and appropriate to the circumstances. The project team is
74 | obligated to maintain confidentiality with regard to the reporter of an incident.
75 | Further details of specific enforcement policies may be posted separately.
76 |
77 | Project maintainers who do not follow or enforce the Code of Conduct in good
78 | faith may face temporary or permanent repercussions as determined by other
79 | members of the project's leadership.
80 |
81 | ### Attribution
82 |
83 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
84 | available at [http://contributor-covenant.org/version/1/4][version]
85 |
86 | [homepage]: http://contributor-covenant.org
87 | [version]: http://contributor-covenant.org/version/1/4/
88 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Abdulazeez Abdulazeez Adeshina
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Favico Generator.
2 | [](https://github.com/acekyd/made-in-nigeria) [](https://www.codetriage.com/youngestdev/favico-generator) 

3 |
4 | # About
5 | Simple but powerful favicon generator.
6 | Favico generator by me. It generates favicons from images.
7 |
8 |
9 | # Installing Favico generator.
10 |
11 | ### On Unix/Linux
12 | ```
13 | sudo npm install -g favico-generator
14 | ```
15 | ### On Windows
16 | ```
17 | npm install -g favico-generator
18 | ```
19 |
20 |
21 | # Usage.
22 |
23 | ```bash
24 | favico-generator
25 | Usage: favico-generator option filename
26 | e.g favico-generator -f image.png -r 160x160
27 |
28 | Options:
29 | --version Show version number [boolean]
30 | -f, --file Loads file to be converted to favico [required]
31 | -r, --res Specifies the width and height of the favico to be generated e.g 160x160 [required]
32 | -h, --help Show help
33 | ```
34 |
35 | `favico-generator`
36 |
37 | ## Creating favicos
38 | Use the command : `favico-generator -f image.jpg -r 160x160` and then follow the instructions to view your favico.
39 |
40 | ## NOTE
41 | 160x160 is the default resolution, you can change the value to maybe something like 100x100, 200x100 etc.
42 |
43 |
44 |
45 | ## Contributing
46 | Have any idea, found any bug or want to improve this project, check out the contributing guidelines HERE
47 |
48 | ## Contact
49 | To contact me, you can tweet to me at my twitter handle @Kvng_zeez.
50 | Or if it's a long message just mail me at `laisibizness@gmail.com`. You can also reach me on facebook by clicking Me
51 |
52 | # Thanks !
53 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | /*
4 | Favico Generator.. Generates Favicons from Image files by Abdul
5 | */
6 |
7 | // Lets start the party over here..
8 | const fs = require('fs');
9 | const argv = require('yargs')
10 | .usage('Usage: $0 option filename \n e.g $0 -f image.png -r 160x160')
11 | .alias('f', 'file')
12 | .alias('r', 'res')
13 | .nargs('f', 1)
14 | .nargs('r', 1)
15 | .describe('f', 'Loads file to be converted to favico')
16 | .describe('r', 'Specifies the width and height e.g 160x160')
17 | .demandOption(['f', 'r'])
18 | .help('h')
19 | .alias('h', 'help')
20 | .epilog('Copyright Abdul 2017').argv;
21 |
22 | const favico = require('./src/lib');
23 |
24 | favico(argv.file, 'favico.ico', argv.res)
25 | .then(() =>
26 | console.log('Success, File saved as favico.ico in ' + process.cwd())
27 | )
28 | .catch(console.error);
29 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "favico-generator",
3 | "version": "2.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "ajv": {
8 | "version": "5.5.2",
9 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
10 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
11 | "requires": {
12 | "co": "^4.6.0",
13 | "fast-deep-equal": "^1.0.0",
14 | "fast-json-stable-stringify": "^2.0.0",
15 | "json-schema-traverse": "^0.3.0"
16 | }
17 | },
18 | "ansi-regex": {
19 | "version": "2.1.1",
20 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
21 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
22 | },
23 | "asn1": {
24 | "version": "0.2.4",
25 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
26 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
27 | "requires": {
28 | "safer-buffer": "~2.1.0"
29 | }
30 | },
31 | "assert-plus": {
32 | "version": "1.0.0",
33 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
34 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
35 | },
36 | "asynckit": {
37 | "version": "0.4.0",
38 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
39 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
40 | },
41 | "aws-sign2": {
42 | "version": "0.7.0",
43 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
44 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
45 | },
46 | "aws4": {
47 | "version": "1.8.0",
48 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
49 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
50 | },
51 | "bcrypt-pbkdf": {
52 | "version": "1.0.2",
53 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
54 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
55 | "requires": {
56 | "tweetnacl": "^0.14.3"
57 | }
58 | },
59 | "camelcase": {
60 | "version": "4.1.0",
61 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
62 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
63 | },
64 | "caseless": {
65 | "version": "0.12.0",
66 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
67 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
68 | },
69 | "cliui": {
70 | "version": "3.2.0",
71 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
72 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
73 | "requires": {
74 | "string-width": "^1.0.1",
75 | "strip-ansi": "^3.0.1",
76 | "wrap-ansi": "^2.0.0"
77 | },
78 | "dependencies": {
79 | "string-width": {
80 | "version": "1.0.2",
81 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
82 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
83 | "requires": {
84 | "code-point-at": "^1.0.0",
85 | "is-fullwidth-code-point": "^1.0.0",
86 | "strip-ansi": "^3.0.0"
87 | }
88 | }
89 | }
90 | },
91 | "co": {
92 | "version": "4.6.0",
93 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
94 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
95 | },
96 | "code-point-at": {
97 | "version": "1.1.0",
98 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
99 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
100 | },
101 | "combined-stream": {
102 | "version": "1.0.7",
103 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
104 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
105 | "requires": {
106 | "delayed-stream": "~1.0.0"
107 | }
108 | },
109 | "core-util-is": {
110 | "version": "1.0.2",
111 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
112 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
113 | },
114 | "cross-spawn": {
115 | "version": "5.1.0",
116 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
117 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
118 | "requires": {
119 | "lru-cache": "^4.0.1",
120 | "shebang-command": "^1.2.0",
121 | "which": "^1.2.9"
122 | }
123 | },
124 | "dashdash": {
125 | "version": "1.14.1",
126 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
127 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
128 | "requires": {
129 | "assert-plus": "^1.0.0"
130 | }
131 | },
132 | "decamelize": {
133 | "version": "1.2.0",
134 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
135 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
136 | },
137 | "delayed-stream": {
138 | "version": "1.0.0",
139 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
140 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
141 | },
142 | "ecc-jsbn": {
143 | "version": "0.1.2",
144 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
145 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
146 | "requires": {
147 | "jsbn": "~0.1.0",
148 | "safer-buffer": "^2.1.0"
149 | }
150 | },
151 | "execa": {
152 | "version": "0.7.0",
153 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
154 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
155 | "requires": {
156 | "cross-spawn": "^5.0.1",
157 | "get-stream": "^3.0.0",
158 | "is-stream": "^1.1.0",
159 | "npm-run-path": "^2.0.0",
160 | "p-finally": "^1.0.0",
161 | "signal-exit": "^3.0.0",
162 | "strip-eof": "^1.0.0"
163 | }
164 | },
165 | "extend": {
166 | "version": "3.0.2",
167 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
168 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
169 | },
170 | "extsprintf": {
171 | "version": "1.3.0",
172 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
173 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
174 | },
175 | "fast-deep-equal": {
176 | "version": "1.1.0",
177 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
178 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
179 | },
180 | "fast-json-stable-stringify": {
181 | "version": "2.0.0",
182 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
183 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
184 | },
185 | "find-up": {
186 | "version": "2.1.0",
187 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
188 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
189 | "requires": {
190 | "locate-path": "^2.0.0"
191 | }
192 | },
193 | "forever-agent": {
194 | "version": "0.6.1",
195 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
196 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
197 | },
198 | "form-data": {
199 | "version": "2.3.2",
200 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
201 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
202 | "requires": {
203 | "asynckit": "^0.4.0",
204 | "combined-stream": "1.0.6",
205 | "mime-types": "^2.1.12"
206 | },
207 | "dependencies": {
208 | "combined-stream": {
209 | "version": "1.0.6",
210 | "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
211 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
212 | "requires": {
213 | "delayed-stream": "~1.0.0"
214 | }
215 | }
216 | }
217 | },
218 | "get-caller-file": {
219 | "version": "1.0.2",
220 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
221 | "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U="
222 | },
223 | "get-stream": {
224 | "version": "3.0.0",
225 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
226 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
227 | },
228 | "getpass": {
229 | "version": "0.1.7",
230 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
231 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
232 | "requires": {
233 | "assert-plus": "^1.0.0"
234 | }
235 | },
236 | "har-schema": {
237 | "version": "2.0.0",
238 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
239 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
240 | },
241 | "har-validator": {
242 | "version": "5.1.0",
243 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
244 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
245 | "requires": {
246 | "ajv": "^5.3.0",
247 | "har-schema": "^2.0.0"
248 | }
249 | },
250 | "http-signature": {
251 | "version": "1.2.0",
252 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
253 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
254 | "requires": {
255 | "assert-plus": "^1.0.0",
256 | "jsprim": "^1.2.2",
257 | "sshpk": "^1.7.0"
258 | }
259 | },
260 | "imagemagick": {
261 | "version": "0.1.3",
262 | "resolved": "https://registry.npmjs.org/imagemagick/-/imagemagick-0.1.3.tgz",
263 | "integrity": "sha1-dIPOoJO02fLi85aFetyIIbU3xWo="
264 | },
265 | "invert-kv": {
266 | "version": "1.0.0",
267 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
268 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
269 | },
270 | "is-fullwidth-code-point": {
271 | "version": "1.0.0",
272 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
273 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
274 | "requires": {
275 | "number-is-nan": "^1.0.0"
276 | }
277 | },
278 | "is-stream": {
279 | "version": "1.1.0",
280 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
281 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
282 | },
283 | "is-typedarray": {
284 | "version": "1.0.0",
285 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
286 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
287 | },
288 | "isexe": {
289 | "version": "2.0.0",
290 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
291 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
292 | },
293 | "isstream": {
294 | "version": "0.1.2",
295 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
296 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
297 | },
298 | "jsbn": {
299 | "version": "0.1.1",
300 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
301 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
302 | },
303 | "json-schema": {
304 | "version": "0.2.3",
305 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
306 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
307 | },
308 | "json-schema-traverse": {
309 | "version": "0.3.1",
310 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
311 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
312 | },
313 | "json-stringify-safe": {
314 | "version": "5.0.1",
315 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
316 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
317 | },
318 | "jsprim": {
319 | "version": "1.4.1",
320 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
321 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
322 | "requires": {
323 | "assert-plus": "1.0.0",
324 | "extsprintf": "1.3.0",
325 | "json-schema": "0.2.3",
326 | "verror": "1.10.0"
327 | }
328 | },
329 | "lcid": {
330 | "version": "1.0.0",
331 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
332 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
333 | "requires": {
334 | "invert-kv": "^1.0.0"
335 | }
336 | },
337 | "locate-path": {
338 | "version": "2.0.0",
339 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
340 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
341 | "requires": {
342 | "p-locate": "^2.0.0",
343 | "path-exists": "^3.0.0"
344 | }
345 | },
346 | "lru-cache": {
347 | "version": "4.1.1",
348 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
349 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
350 | "requires": {
351 | "pseudomap": "^1.0.2",
352 | "yallist": "^2.1.2"
353 | }
354 | },
355 | "mem": {
356 | "version": "1.1.0",
357 | "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
358 | "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
359 | "requires": {
360 | "mimic-fn": "^1.0.0"
361 | }
362 | },
363 | "mime-db": {
364 | "version": "1.36.0",
365 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
366 | "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw=="
367 | },
368 | "mime-types": {
369 | "version": "2.1.20",
370 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
371 | "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
372 | "requires": {
373 | "mime-db": "~1.36.0"
374 | }
375 | },
376 | "mimic-fn": {
377 | "version": "1.1.0",
378 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
379 | "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg="
380 | },
381 | "npm-run-path": {
382 | "version": "2.0.2",
383 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
384 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
385 | "requires": {
386 | "path-key": "^2.0.0"
387 | }
388 | },
389 | "number-is-nan": {
390 | "version": "1.0.1",
391 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
392 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
393 | },
394 | "oauth-sign": {
395 | "version": "0.9.0",
396 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
397 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
398 | },
399 | "os-locale": {
400 | "version": "2.1.0",
401 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
402 | "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
403 | "requires": {
404 | "execa": "^0.7.0",
405 | "lcid": "^1.0.0",
406 | "mem": "^1.1.0"
407 | }
408 | },
409 | "p-finally": {
410 | "version": "1.0.0",
411 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
412 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
413 | },
414 | "p-limit": {
415 | "version": "1.1.0",
416 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz",
417 | "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw="
418 | },
419 | "p-locate": {
420 | "version": "2.0.0",
421 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
422 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
423 | "requires": {
424 | "p-limit": "^1.1.0"
425 | }
426 | },
427 | "path-exists": {
428 | "version": "3.0.0",
429 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
430 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
431 | },
432 | "path-key": {
433 | "version": "2.0.1",
434 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
435 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
436 | },
437 | "performance-now": {
438 | "version": "2.1.0",
439 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
440 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
441 | },
442 | "pseudomap": {
443 | "version": "1.0.2",
444 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
445 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
446 | },
447 | "psl": {
448 | "version": "1.1.29",
449 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
450 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ=="
451 | },
452 | "punycode": {
453 | "version": "1.4.1",
454 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
455 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
456 | },
457 | "qs": {
458 | "version": "6.5.2",
459 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
460 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
461 | },
462 | "request": {
463 | "version": "2.88.0",
464 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
465 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
466 | "requires": {
467 | "aws-sign2": "~0.7.0",
468 | "aws4": "^1.8.0",
469 | "caseless": "~0.12.0",
470 | "combined-stream": "~1.0.6",
471 | "extend": "~3.0.2",
472 | "forever-agent": "~0.6.1",
473 | "form-data": "~2.3.2",
474 | "har-validator": "~5.1.0",
475 | "http-signature": "~1.2.0",
476 | "is-typedarray": "~1.0.0",
477 | "isstream": "~0.1.2",
478 | "json-stringify-safe": "~5.0.1",
479 | "mime-types": "~2.1.19",
480 | "oauth-sign": "~0.9.0",
481 | "performance-now": "^2.1.0",
482 | "qs": "~6.5.2",
483 | "safe-buffer": "^5.1.2",
484 | "tough-cookie": "~2.4.3",
485 | "tunnel-agent": "^0.6.0",
486 | "uuid": "^3.3.2"
487 | }
488 | },
489 | "require-directory": {
490 | "version": "2.1.1",
491 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
492 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
493 | },
494 | "require-main-filename": {
495 | "version": "1.0.1",
496 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
497 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
498 | },
499 | "safe-buffer": {
500 | "version": "5.1.2",
501 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
502 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
503 | },
504 | "safer-buffer": {
505 | "version": "2.1.2",
506 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
507 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
508 | },
509 | "set-blocking": {
510 | "version": "2.0.0",
511 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
512 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
513 | },
514 | "shebang-command": {
515 | "version": "1.2.0",
516 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
517 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
518 | "requires": {
519 | "shebang-regex": "^1.0.0"
520 | }
521 | },
522 | "shebang-regex": {
523 | "version": "1.0.0",
524 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
525 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
526 | },
527 | "signal-exit": {
528 | "version": "3.0.2",
529 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
530 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
531 | },
532 | "sshpk": {
533 | "version": "1.15.1",
534 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz",
535 | "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==",
536 | "requires": {
537 | "asn1": "~0.2.3",
538 | "assert-plus": "^1.0.0",
539 | "bcrypt-pbkdf": "^1.0.0",
540 | "dashdash": "^1.12.0",
541 | "ecc-jsbn": "~0.1.1",
542 | "getpass": "^0.1.1",
543 | "jsbn": "~0.1.0",
544 | "safer-buffer": "^2.0.2",
545 | "tweetnacl": "~0.14.0"
546 | }
547 | },
548 | "string-width": {
549 | "version": "2.1.1",
550 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
551 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
552 | "requires": {
553 | "is-fullwidth-code-point": "^2.0.0",
554 | "strip-ansi": "^4.0.0"
555 | },
556 | "dependencies": {
557 | "ansi-regex": {
558 | "version": "3.0.0",
559 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
560 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
561 | },
562 | "is-fullwidth-code-point": {
563 | "version": "2.0.0",
564 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
565 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
566 | },
567 | "strip-ansi": {
568 | "version": "4.0.0",
569 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
570 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
571 | "requires": {
572 | "ansi-regex": "^3.0.0"
573 | }
574 | }
575 | }
576 | },
577 | "strip-ansi": {
578 | "version": "3.0.1",
579 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
580 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
581 | "requires": {
582 | "ansi-regex": "^2.0.0"
583 | }
584 | },
585 | "strip-eof": {
586 | "version": "1.0.0",
587 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
588 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
589 | },
590 | "tough-cookie": {
591 | "version": "2.4.3",
592 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
593 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
594 | "requires": {
595 | "psl": "^1.1.24",
596 | "punycode": "^1.4.1"
597 | }
598 | },
599 | "tunnel-agent": {
600 | "version": "0.6.0",
601 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
602 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
603 | "requires": {
604 | "safe-buffer": "^5.0.1"
605 | }
606 | },
607 | "tweetnacl": {
608 | "version": "0.14.5",
609 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
610 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
611 | },
612 | "user": {
613 | "version": "0.0.0",
614 | "resolved": "https://registry.npmjs.org/user/-/user-0.0.0.tgz",
615 | "integrity": "sha1-8n8bI/xRHyqO+kDbVc+6Ejgk4Co="
616 | },
617 | "uuid": {
618 | "version": "3.3.2",
619 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
620 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
621 | },
622 | "verror": {
623 | "version": "1.10.0",
624 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
625 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
626 | "requires": {
627 | "assert-plus": "^1.0.0",
628 | "core-util-is": "1.0.2",
629 | "extsprintf": "^1.2.0"
630 | }
631 | },
632 | "which": {
633 | "version": "1.3.0",
634 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
635 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
636 | "requires": {
637 | "isexe": "^2.0.0"
638 | }
639 | },
640 | "which-module": {
641 | "version": "2.0.0",
642 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
643 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
644 | },
645 | "wrap-ansi": {
646 | "version": "2.1.0",
647 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
648 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
649 | "requires": {
650 | "string-width": "^1.0.1",
651 | "strip-ansi": "^3.0.1"
652 | },
653 | "dependencies": {
654 | "string-width": {
655 | "version": "1.0.2",
656 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
657 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
658 | "requires": {
659 | "code-point-at": "^1.0.0",
660 | "is-fullwidth-code-point": "^1.0.0",
661 | "strip-ansi": "^3.0.0"
662 | }
663 | }
664 | }
665 | },
666 | "y18n": {
667 | "version": "3.2.1",
668 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
669 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
670 | },
671 | "yallist": {
672 | "version": "2.1.2",
673 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
674 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
675 | },
676 | "yargs": {
677 | "version": "10.0.3",
678 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.0.3.tgz",
679 | "integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==",
680 | "requires": {
681 | "cliui": "^3.2.0",
682 | "decamelize": "^1.1.1",
683 | "find-up": "^2.1.0",
684 | "get-caller-file": "^1.0.1",
685 | "os-locale": "^2.0.0",
686 | "require-directory": "^2.1.1",
687 | "require-main-filename": "^1.0.1",
688 | "set-blocking": "^2.0.0",
689 | "string-width": "^2.0.0",
690 | "which-module": "^2.0.0",
691 | "y18n": "^3.2.1",
692 | "yargs-parser": "^8.0.0"
693 | }
694 | },
695 | "yargs-parser": {
696 | "version": "8.0.0",
697 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.0.0.tgz",
698 | "integrity": "sha1-IdR2Mw5agieaS4gTRb8GYQLiGcY=",
699 | "requires": {
700 | "camelcase": "^4.1.0"
701 | }
702 | }
703 | }
704 | }
705 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "favico-generator",
3 | "version": "2.0.0",
4 | "description": "Simple command line tool that generate favicons from image files.",
5 | "main": "index.js",
6 | "dependencies": {
7 | "imagemagick": "^0.1.3",
8 | "request": "^2.88.0",
9 | "user": "^0.0.0",
10 | "yargs": "^10.0.3"
11 | },
12 | "devDependencies": {},
13 | "scripts": {
14 | "test": "echo \\\"Error: no test specified\\\" && exit 1"
15 | },
16 | "bin": {
17 | "favico-generator": "./index.js"
18 | },
19 | "repository": {
20 | "type": "git",
21 | "url": "git+https://github.com/Youngestdev/favico-generator.git"
22 | },
23 | "author": "Abdulazeez Abdulazeez Adeshina (http://twitter.com/kvng_zeez)",
24 | "license": "MIT",
25 | "bugs": {
26 | "url": "https://github.com/Youngestdev/favico-generator/issues"
27 | },
28 | "homepage": "https://github.com/Youngestdev/favico-generator#readme"
29 | }
30 |
--------------------------------------------------------------------------------
/src/gui/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | [
4 | "env",
5 | {
6 | "targets": {
7 | "node": "current"
8 | },
9 | "useBuiltIns": "usage"
10 | }
11 | ],
12 | "stage-0",
13 | "react"
14 | ]
15 | }
--------------------------------------------------------------------------------
/src/gui/components/main.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import {
3 | Box,
4 | Button,
5 | Dialog,
6 | Form,
7 | ProgressBar,
8 | Separator,
9 | Spinbox,
10 | StyledText,
11 | TextInput
12 | } from 'proton-native';
13 |
14 | import favico from '../lib';
15 | import { METHOD_FILE, METHOD_URL } from '../constants';
16 |
17 | const intRegex = /\d+/;
18 | const urlRegex = /[(http(s)?):\/\/(www\.)?a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/;
19 |
20 | class Main extends Component {
21 | constructor() {
22 | super();
23 | this.handleChangeInput = this.handleChangeURL.bind(this);
24 | this.handleChangeSize = this.handleChangeSize.bind(this);
25 | this.handleChooseFile = this.handleChooseFile.bind(this);
26 | this.handleClick = this.handleClick.bind(this);
27 | this.state = {
28 | filename: '',
29 | progress: 0,
30 | size: 160
31 | };
32 | }
33 |
34 | handleChangeURL(filename) {
35 | if (!filename) return;
36 | this.setState({ filename, method: METHOD_URL });
37 | }
38 |
39 | handleChangeSize(size) {
40 | this.setState({ size });
41 | }
42 |
43 | handleChooseFile() {
44 | const filename = Dialog('Open');
45 | this.setState({ filename, method: METHOD_FILE });
46 | }
47 |
48 | handleClick() {
49 | const { filename, method, size } = this.state;
50 |
51 | if (method === METHOD_URL && !urlRegex.test(filename)) {
52 | return Dialog('Error', {
53 | title: 'Fix errors',
54 | description: 'Invalid URL'
55 | });
56 | }
57 |
58 | if (method !== METHOD_URL && !filename) {
59 | return Dialog('Error', {
60 | title: 'Fix errors',
61 | description: 'Missing file'
62 | });
63 | }
64 |
65 | if (!intRegex.test(size)) {
66 | return Dialog('Error', {
67 | title: 'Fix errors',
68 | description: 'Invalid size'
69 | });
70 | }
71 |
72 | const ref = setInterval(() => {
73 | const { progress } = this.state;
74 | this.setState({ progress: progress < 100 ? progress + 1 : 1 });
75 | if (progress > 99) {
76 | this.setState({ progress: 0 });
77 | }
78 | }, 100);
79 |
80 | favico(filename, undefined, `${size}x${size}`)
81 | .then(() => {
82 | clearInterval(ref);
83 | this.setState({ progress: 0 });
84 | Dialog('Message', {
85 | title: 'Success',
86 | description: 'File saved as favico.ico'
87 | });
88 | })
89 | .catch(() => {
90 | clearInterval(ref);
91 | this.setState({ progress: 0 });
92 | Dialog('Error', {
93 | title: 'An error ocurred',
94 | description:
95 | method !== METHOD_URL
96 | ? "Try to open program from another directory or there's enough free space"
97 | : 'Check if the URL exists'
98 | });
99 | });
100 | }
101 |
102 | render() {
103 | const { progress = 0, size = 160 } = this.state;
104 | return (
105 |
106 |
116 |
117 |
120 | 0 && progress < 100}
123 | />
124 |
125 | );
126 | }
127 | }
128 |
129 | export default Main;
130 |
--------------------------------------------------------------------------------
/src/gui/constants/index.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | METHOD_URL: 'URL',
3 | METHOD_FILE: 'FILE'
4 | };
5 |
--------------------------------------------------------------------------------
/src/gui/index.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { render, Window, App } from 'proton-native';
3 |
4 | import Main from './components/main';
5 |
6 | const FavicoApp = () => (
7 |
8 |
14 |
15 |
16 |
17 | );
18 |
19 | render();
20 |
--------------------------------------------------------------------------------
/src/gui/lib/index.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | const os = require('os');
3 | const path = require('path');
4 | const request = require('request');
5 | const im = require('imagemagick');
6 |
7 | const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'favico-'));
8 |
9 | /**
10 | * Download files from a remote location
11 | *
12 | * @param {string} uri
13 | * @returns Promise
14 | */
15 | const downloadFile = uri =>
16 | new Promise((resolve, reject) => {
17 | const filename = path.basename(uri);
18 | const writableStream = fs.createWriteStream(path.join(tempDir, filename));
19 | const onError = err => {
20 | fs.unlink(writableStream);
21 | reject(new Error(err.message));
22 | };
23 |
24 | request
25 | .get(uri)
26 | .on('error', onError)
27 | .pipe(writableStream);
28 |
29 | writableStream.on('close', () => {
30 | writableStream.close();
31 | resolve(writableStream.path);
32 | });
33 | writableStream.on('error', onError);
34 | });
35 |
36 | /**
37 | * Convert an image to other format
38 | *
39 | * @param {string} source
40 | * @param {string} [output='favico.ico']
41 | * @param {string} [args=['-resize', '160x160']]
42 | * @returns Promise
43 | */
44 | const convertImage = (
45 | source,
46 | output = 'favico.ico',
47 | args = ['-resize', '160x160']
48 | ) =>
49 | new Promise((resolve, reject) => {
50 | im.convert([source, ...args, output], (err, result) => {
51 | if (err) {
52 | reject(err);
53 | } else {
54 | resolve(result);
55 | }
56 | });
57 | });
58 |
59 | /**
60 | * @param {String} from
61 | * @param {String} [to='favico.ico']
62 | * @param {Array} [resize='160x160']
63 | */
64 | module.exports = (from, to = 'favico.ico', resize = '160x160') =>
65 | fs.existsSync(from)
66 | ? convertImage(from, to, ['-resize', resize])
67 | : downloadFile(from).then(file =>
68 | convertImage(file, to, ['-resize', resize])
69 | );
70 |
--------------------------------------------------------------------------------
/src/gui/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "favico-generator-gui",
3 | "version": "1.0.0",
4 | "description": "Simple tool that generate favicons from image files.",
5 | "main": "index.js",
6 | "private": true,
7 | "scripts": {
8 | "build": "babel --minified --out-dir bin index.js",
9 | "dev": "nodemon",
10 | "dist": "electron-builder",
11 | "pack": "electron-builder --dir",
12 | "start": "babel-node index.js",
13 | "test": "echo \"Error: no test specified\" && exit 1"
14 | },
15 | "repository": {
16 | "type": "git",
17 | "url": "git+https://github.com/Youngestdev/favico-generator.git"
18 | },
19 | "author": "Abdulazeez Abdulazeez Adeshina (http://twitter.com/kvng_zeez)",
20 | "contributors": [
21 | "Jaime Leonardo Suncin Cruz (http://suncin.me)"
22 | ],
23 | "license": "MIT",
24 | "bugs": {
25 | "url": "https://github.com/Youngestdev/favico-generator/issues"
26 | },
27 | "homepage": "https://github.com/Youngestdev/favico-generator#readme",
28 | "dependencies": {
29 | "imagemagick": "^0.1.3",
30 | "proton-native": "^1.1.9",
31 | "request": "^2.88.0"
32 | },
33 | "devDependencies": {
34 | "babel-cli": "latest",
35 | "babel-preset-env": "latest",
36 | "babel-preset-react": "latest",
37 | "babel-preset-stage-0": "latest",
38 | "electron-builder": "latest",
39 | "nodemon": "latest"
40 | },
41 | "nodemonConfig": {
42 | "ignore": [
43 | "node_modules/**",
44 | "bin",
45 | "dist",
46 | "build"
47 | ],
48 | "exec": "npm start"
49 | },
50 | "build": {
51 | "productName": "Favico Generator",
52 | "protonNodeVersion": "current",
53 | "mac": {
54 | "category": "public.app-category.utilities",
55 | "identity": null
56 | },
57 | "linux": {
58 | "target": "AppImage",
59 | "category": "Utility"
60 | },
61 | "win": {
62 | "target": "portable"
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/src/lib/convertImage.js:
--------------------------------------------------------------------------------
1 | const im = require('imagemagick');
2 |
3 | /**
4 | * Convert an image to other format
5 | *
6 | * @param {string} source
7 | * @param {string} [output='favico.ico']
8 | * @param {string} [args=['-resize', '160x160']]
9 | * @returns Promise
10 | */
11 | module.exports = (
12 | source,
13 | output = 'favico.ico',
14 | args = ['-resize', '160x160']
15 | ) =>
16 | new Promise((resolve, reject) => {
17 | im.convert([source, ...args, output], (err, result) => {
18 | if (err) {
19 | reject(err);
20 | } else {
21 | resolve(result);
22 | }
23 | });
24 | });
25 |
--------------------------------------------------------------------------------
/src/lib/downloadFile.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | const os = require('os');
3 | const path = require('path');
4 | const request = require('request');
5 | const { name } = require('../../package.json');
6 |
7 | const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), `${name}-`));
8 |
9 | /**
10 | * Download files from a remote location
11 | *
12 | * @param {string} uri
13 | * @returns Promise
14 | */
15 | module.exports = uri =>
16 | new Promise((resolve, reject) => {
17 | const filename = path.basename(uri);
18 | const writableStream = fs.createWriteStream(path.join(tempDir, filename));
19 | const onError = err => {
20 | fs.unlink(writableStream);
21 | reject(new Error(err.message));
22 | };
23 |
24 | request
25 | .get(uri)
26 | .on('error', onError)
27 | .pipe(writableStream);
28 |
29 | writableStream.on('close', () => {
30 | writableStream.close();
31 | resolve(writableStream.path);
32 | });
33 | writableStream.on('error', onError);
34 | });
35 |
--------------------------------------------------------------------------------
/src/lib/index.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 |
3 | const convertImage = require('./convertImage');
4 | const downloadFile = require('./downloadFile');
5 |
6 | /**
7 | * @param {String} from
8 | * @param {String} [to='favico.ico']
9 | * @param {Array} [resize='160x160']
10 | */
11 | module.exports = (from, to = 'favico.ico', resize = '160x160') =>
12 | fs.existsSync(from)
13 | ? convertImage(from, to, ['-resize', resize])
14 | : downloadFile(from).then(file =>
15 | convertImage(file, to, ['-resize', resize])
16 | );
17 |
--------------------------------------------------------------------------------