├── .gitignore
├── README.md
├── common.js
├── example
├── favicon.png
├── faviconDescription.json
└── test.html
├── package-lock.json
├── package.json
├── real-favicon-check-for-update.js
├── real-favicon-generate.js
├── real-favicon-inject.js
└── real-favicon.js
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 |
5 | # Runtime data
6 | pids
7 | *.pid
8 | *.seed
9 |
10 | # Directory for instrumented libs generated by jscoverage/JSCover
11 | lib-cov
12 |
13 | # Coverage directory used by tools like istanbul
14 | coverage
15 |
16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
17 | .grunt
18 |
19 | # node-waf configuration
20 | .lock-wscript
21 |
22 | # Compiled binary addons (http://nodejs.org/api/addons.html)
23 | build/Release
24 |
25 | # Dependency directory
26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
27 | node_modules
28 |
29 | example/faviconData.json
30 | example/out
31 |
32 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # cli-real-favicon
2 |
3 | Use this Node.js CLI to generate a multiplatform favicon with [RealFaviconGenerator](http://realfavicongenerator.net/).
4 |
5 | ## Getting Started
6 |
7 | No time to learn yet-another-set-of-options:
8 |
9 | - Go to [RealFaviconGenerator](http://realfavicongenerator.net/), submit your original image and craft your icons:
10 |
11 | 
12 |
13 | - On the result page, click the Node CLI tab. Follow the instructions to setup your favicon in your Gulp project:
14 |
15 | 
16 |
17 | Et voilà! Your favicon is up and ready.
18 |
--------------------------------------------------------------------------------
/common.js:
--------------------------------------------------------------------------------
1 |
2 | API_KEY = '402333a17311c9aa68257b9c5fc571276090ee56';
3 |
--------------------------------------------------------------------------------
/example/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RealFaviconGenerator/cli-real-favicon/2d0ce0903262c376d2a9ae500a1aa107d11c2377/example/favicon.png
--------------------------------------------------------------------------------
/example/faviconDescription.json:
--------------------------------------------------------------------------------
1 | {
2 | "masterPicture": "example/favicon.png",
3 | "iconsPath": "/",
4 | "design": {
5 | "ios": {
6 | "pictureAspect": "noChange"
7 | },
8 | "desktopBrowser": {},
9 | "windows": {
10 | "pictureAspect": "noChange",
11 | "backgroundColor": "#da532c",
12 | "onConflict": "override"
13 | },
14 | "androidChrome": {
15 | "pictureAspect": "noChange",
16 | "themeColor": "#ffffff",
17 | "manifest": {
18 | "name": "TestApp",
19 | "display": "browser",
20 | "orientation": "notSet",
21 | "onConflict": "override"
22 | }
23 | },
24 | "safariPinnedTab": {
25 | "pictureAspect": "silhouette",
26 | "themeColor": "#5bbad5"
27 | }
28 | },
29 | "settings": {
30 | "scalingAlgorithm": "Mitchell",
31 | "errorOnImageTooSmall": false
32 | }
33 | }
--------------------------------------------------------------------------------
/example/test.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Title
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cli-real-favicon",
3 | "version": "0.0.8",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "cli-real-favicon",
9 | "version": "0.0.8",
10 | "license": "MIT",
11 | "dependencies": {
12 | "bluebird": "^3.5.5",
13 | "commander": "^2.20.0",
14 | "glob": "^6.0.4",
15 | "rfg-api": "^0.5.3"
16 | },
17 | "bin": {
18 | "real-favicon": "real-favicon.js"
19 | }
20 | },
21 | "node_modules/async": {
22 | "version": "3.2.5",
23 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
24 | "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg=="
25 | },
26 | "node_modules/axios": {
27 | "version": "0.21.4",
28 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
29 | "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
30 | "dependencies": {
31 | "follow-redirects": "^1.14.0"
32 | }
33 | },
34 | "node_modules/balanced-match": {
35 | "version": "1.0.0",
36 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
37 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
38 | },
39 | "node_modules/binary": {
40 | "version": "0.3.0",
41 | "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
42 | "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==",
43 | "dependencies": {
44 | "buffers": "~0.1.1",
45 | "chainsaw": "~0.1.0"
46 | },
47 | "engines": {
48 | "node": "*"
49 | }
50 | },
51 | "node_modules/bluebird": {
52 | "version": "3.5.5",
53 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
54 | "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w=="
55 | },
56 | "node_modules/boolbase": {
57 | "version": "1.0.0",
58 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
59 | "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
60 | },
61 | "node_modules/brace-expansion": {
62 | "version": "1.1.11",
63 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
64 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
65 | "dependencies": {
66 | "balanced-match": "^1.0.0",
67 | "concat-map": "0.0.1"
68 | }
69 | },
70 | "node_modules/buffers": {
71 | "version": "0.1.1",
72 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
73 | "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==",
74 | "engines": {
75 | "node": ">=0.2.0"
76 | }
77 | },
78 | "node_modules/chainsaw": {
79 | "version": "0.1.0",
80 | "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
81 | "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==",
82 | "dependencies": {
83 | "traverse": ">=0.3.0 <0.4"
84 | },
85 | "engines": {
86 | "node": "*"
87 | }
88 | },
89 | "node_modules/cheerio": {
90 | "version": "1.0.0-rc.12",
91 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
92 | "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
93 | "dependencies": {
94 | "cheerio-select": "^2.1.0",
95 | "dom-serializer": "^2.0.0",
96 | "domhandler": "^5.0.3",
97 | "domutils": "^3.0.1",
98 | "htmlparser2": "^8.0.1",
99 | "parse5": "^7.0.0",
100 | "parse5-htmlparser2-tree-adapter": "^7.0.0"
101 | },
102 | "engines": {
103 | "node": ">= 6"
104 | },
105 | "funding": {
106 | "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
107 | }
108 | },
109 | "node_modules/cheerio-select": {
110 | "version": "2.1.0",
111 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
112 | "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
113 | "dependencies": {
114 | "boolbase": "^1.0.0",
115 | "css-select": "^5.1.0",
116 | "css-what": "^6.1.0",
117 | "domelementtype": "^2.3.0",
118 | "domhandler": "^5.0.3",
119 | "domutils": "^3.0.1"
120 | },
121 | "funding": {
122 | "url": "https://github.com/sponsors/fb55"
123 | }
124 | },
125 | "node_modules/commander": {
126 | "version": "2.20.0",
127 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
128 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ=="
129 | },
130 | "node_modules/concat-map": {
131 | "version": "0.0.1",
132 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
133 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
134 | },
135 | "node_modules/core-util-is": {
136 | "version": "1.0.3",
137 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
138 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
139 | },
140 | "node_modules/css-select": {
141 | "version": "5.1.0",
142 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
143 | "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
144 | "dependencies": {
145 | "boolbase": "^1.0.0",
146 | "css-what": "^6.1.0",
147 | "domhandler": "^5.0.2",
148 | "domutils": "^3.0.1",
149 | "nth-check": "^2.0.1"
150 | },
151 | "funding": {
152 | "url": "https://github.com/sponsors/fb55"
153 | }
154 | },
155 | "node_modules/css-what": {
156 | "version": "6.1.0",
157 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
158 | "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
159 | "engines": {
160 | "node": ">= 6"
161 | },
162 | "funding": {
163 | "url": "https://github.com/sponsors/fb55"
164 | }
165 | },
166 | "node_modules/dom-serializer": {
167 | "version": "2.0.0",
168 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
169 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
170 | "dependencies": {
171 | "domelementtype": "^2.3.0",
172 | "domhandler": "^5.0.2",
173 | "entities": "^4.2.0"
174 | },
175 | "funding": {
176 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
177 | }
178 | },
179 | "node_modules/domelementtype": {
180 | "version": "2.3.0",
181 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
182 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
183 | "funding": [
184 | {
185 | "type": "github",
186 | "url": "https://github.com/sponsors/fb55"
187 | }
188 | ]
189 | },
190 | "node_modules/domhandler": {
191 | "version": "5.0.3",
192 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
193 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
194 | "dependencies": {
195 | "domelementtype": "^2.3.0"
196 | },
197 | "engines": {
198 | "node": ">= 4"
199 | },
200 | "funding": {
201 | "url": "https://github.com/fb55/domhandler?sponsor=1"
202 | }
203 | },
204 | "node_modules/domutils": {
205 | "version": "3.1.0",
206 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
207 | "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
208 | "dependencies": {
209 | "dom-serializer": "^2.0.0",
210 | "domelementtype": "^2.3.0",
211 | "domhandler": "^5.0.3"
212 | },
213 | "funding": {
214 | "url": "https://github.com/fb55/domutils?sponsor=1"
215 | }
216 | },
217 | "node_modules/entities": {
218 | "version": "4.5.0",
219 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
220 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
221 | "engines": {
222 | "node": ">=0.12"
223 | },
224 | "funding": {
225 | "url": "https://github.com/fb55/entities?sponsor=1"
226 | }
227 | },
228 | "node_modules/follow-redirects": {
229 | "version": "1.15.6",
230 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
231 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
232 | "funding": [
233 | {
234 | "type": "individual",
235 | "url": "https://github.com/sponsors/RubenVerborgh"
236 | }
237 | ],
238 | "engines": {
239 | "node": ">=4.0"
240 | },
241 | "peerDependenciesMeta": {
242 | "debug": {
243 | "optional": true
244 | }
245 | }
246 | },
247 | "node_modules/fs.realpath": {
248 | "version": "1.0.0",
249 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
250 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
251 | },
252 | "node_modules/fstream": {
253 | "version": "1.0.12",
254 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
255 | "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
256 | "dependencies": {
257 | "graceful-fs": "^4.1.2",
258 | "inherits": "~2.0.0",
259 | "mkdirp": ">=0.5 0",
260 | "rimraf": "2"
261 | },
262 | "engines": {
263 | "node": ">=0.6"
264 | }
265 | },
266 | "node_modules/glob": {
267 | "version": "6.0.4",
268 | "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
269 | "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
270 | "dependencies": {
271 | "inflight": "^1.0.4",
272 | "inherits": "2",
273 | "minimatch": "2 || 3",
274 | "once": "^1.3.0",
275 | "path-is-absolute": "^1.0.0"
276 | },
277 | "engines": {
278 | "node": "*"
279 | }
280 | },
281 | "node_modules/graceful-fs": {
282 | "version": "4.2.11",
283 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
284 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
285 | },
286 | "node_modules/htmlparser2": {
287 | "version": "8.0.2",
288 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
289 | "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
290 | "funding": [
291 | "https://github.com/fb55/htmlparser2?sponsor=1",
292 | {
293 | "type": "github",
294 | "url": "https://github.com/sponsors/fb55"
295 | }
296 | ],
297 | "dependencies": {
298 | "domelementtype": "^2.3.0",
299 | "domhandler": "^5.0.3",
300 | "domutils": "^3.0.1",
301 | "entities": "^4.4.0"
302 | }
303 | },
304 | "node_modules/inflight": {
305 | "version": "1.0.4",
306 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz",
307 | "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=",
308 | "dependencies": {
309 | "once": "^1.3.0",
310 | "wrappy": "1"
311 | }
312 | },
313 | "node_modules/inherits": {
314 | "version": "2.0.1",
315 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
316 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
317 | },
318 | "node_modules/isarray": {
319 | "version": "0.0.1",
320 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
321 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
322 | },
323 | "node_modules/match-stream": {
324 | "version": "0.0.2",
325 | "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz",
326 | "integrity": "sha512-TbN21KrvmZ4mHzKqSFeNNNYeOGNNoEE0sQjhOGlHc+W6XhV4nEhJqaQTJj106NF+NYjyJ7pXh23+OQ1d306ORw==",
327 | "dependencies": {
328 | "buffers": "~0.1.1",
329 | "readable-stream": "~1.0.0"
330 | }
331 | },
332 | "node_modules/match-stream/node_modules/readable-stream": {
333 | "version": "1.0.34",
334 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
335 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
336 | "dependencies": {
337 | "core-util-is": "~1.0.0",
338 | "inherits": "~2.0.1",
339 | "isarray": "0.0.1",
340 | "string_decoder": "~0.10.x"
341 | }
342 | },
343 | "node_modules/match-stream/node_modules/string_decoder": {
344 | "version": "0.10.31",
345 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
346 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
347 | },
348 | "node_modules/metaparser": {
349 | "version": "1.0.7",
350 | "resolved": "https://registry.npmjs.org/metaparser/-/metaparser-1.0.7.tgz",
351 | "integrity": "sha512-9f7r6vL2F9LA7T6tvt5cwBrNOfjb7QgGpbnv5qgvCInlQyfBfJV5i+yvvm3b2667N4FF5fJrGVIsnSCTevR8zQ==",
352 | "dependencies": {
353 | "async": "*",
354 | "cheerio": "*",
355 | "mkdirp": "*",
356 | "underscore": "*"
357 | }
358 | },
359 | "node_modules/minimatch": {
360 | "version": "3.1.2",
361 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
362 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
363 | "dependencies": {
364 | "brace-expansion": "^1.1.7"
365 | },
366 | "engines": {
367 | "node": "*"
368 | }
369 | },
370 | "node_modules/minimist": {
371 | "version": "1.2.8",
372 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
373 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
374 | "funding": {
375 | "url": "https://github.com/sponsors/ljharb"
376 | }
377 | },
378 | "node_modules/mkdirp": {
379 | "version": "0.5.6",
380 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
381 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
382 | "dependencies": {
383 | "minimist": "^1.2.6"
384 | },
385 | "bin": {
386 | "mkdirp": "bin/cmd.js"
387 | }
388 | },
389 | "node_modules/node-unzip-2": {
390 | "version": "0.2.8",
391 | "resolved": "https://registry.npmjs.org/node-unzip-2/-/node-unzip-2-0.2.8.tgz",
392 | "integrity": "sha512-fmJi73zTRW7RSo/1wyrKc2srKMwb3L6Ppke/7elzQ0QRt6sUjfiIcVsWdrqO5uEHAdvRKXjoySuo4HYe5BB0rw==",
393 | "dependencies": {
394 | "binary": "~0.3.0",
395 | "fstream": "~1.0.12",
396 | "match-stream": "~0.0.2",
397 | "pullstream": "~0.4.0",
398 | "readable-stream": "~1.0.0",
399 | "setimmediate": "~1.0.1"
400 | }
401 | },
402 | "node_modules/node-unzip-2/node_modules/readable-stream": {
403 | "version": "1.0.34",
404 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
405 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
406 | "dependencies": {
407 | "core-util-is": "~1.0.0",
408 | "inherits": "~2.0.1",
409 | "isarray": "0.0.1",
410 | "string_decoder": "~0.10.x"
411 | }
412 | },
413 | "node_modules/node-unzip-2/node_modules/string_decoder": {
414 | "version": "0.10.31",
415 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
416 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
417 | },
418 | "node_modules/nth-check": {
419 | "version": "2.1.1",
420 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
421 | "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
422 | "dependencies": {
423 | "boolbase": "^1.0.0"
424 | },
425 | "funding": {
426 | "url": "https://github.com/fb55/nth-check?sponsor=1"
427 | }
428 | },
429 | "node_modules/once": {
430 | "version": "1.3.3",
431 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
432 | "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
433 | "dependencies": {
434 | "wrappy": "1"
435 | }
436 | },
437 | "node_modules/over": {
438 | "version": "0.0.5",
439 | "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz",
440 | "integrity": "sha512-EEc3GCT5ce2VgLYKGeomTSgQT+4wkS13Ya9XzKiskHtemWPx0YhVErn7PtiowTOsYtRlFe6FksgwFeWG1aOJdg==",
441 | "engines": {
442 | "node": "*"
443 | }
444 | },
445 | "node_modules/parse5": {
446 | "version": "7.1.2",
447 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
448 | "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
449 | "dependencies": {
450 | "entities": "^4.4.0"
451 | },
452 | "funding": {
453 | "url": "https://github.com/inikulin/parse5?sponsor=1"
454 | }
455 | },
456 | "node_modules/parse5-htmlparser2-tree-adapter": {
457 | "version": "7.0.0",
458 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
459 | "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
460 | "dependencies": {
461 | "domhandler": "^5.0.2",
462 | "parse5": "^7.0.0"
463 | },
464 | "funding": {
465 | "url": "https://github.com/inikulin/parse5?sponsor=1"
466 | }
467 | },
468 | "node_modules/path-is-absolute": {
469 | "version": "1.0.0",
470 | "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz",
471 | "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=",
472 | "engines": {
473 | "node": ">=0.10.0"
474 | }
475 | },
476 | "node_modules/pullstream": {
477 | "version": "0.4.1",
478 | "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz",
479 | "integrity": "sha512-8ckaufxE74rtbwA0lD0GO2Pk/miCfje3uZtGZd/MQpxkoRIBB004aKBnhdc4Y8L7sip0cis/ekib/1lUwUwxuA==",
480 | "dependencies": {
481 | "over": ">= 0.0.5 < 1",
482 | "readable-stream": "~1.0.31",
483 | "setimmediate": ">= 1.0.2 < 2",
484 | "slice-stream": ">= 1.0.0 < 2"
485 | }
486 | },
487 | "node_modules/pullstream/node_modules/readable-stream": {
488 | "version": "1.0.34",
489 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
490 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
491 | "dependencies": {
492 | "core-util-is": "~1.0.0",
493 | "inherits": "~2.0.1",
494 | "isarray": "0.0.1",
495 | "string_decoder": "~0.10.x"
496 | }
497 | },
498 | "node_modules/pullstream/node_modules/string_decoder": {
499 | "version": "0.10.31",
500 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
501 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
502 | },
503 | "node_modules/rfg-api": {
504 | "version": "0.5.3",
505 | "resolved": "https://registry.npmjs.org/rfg-api/-/rfg-api-0.5.3.tgz",
506 | "integrity": "sha512-KQ4Vwc/LrwQ1IFBDEyJdGtn1XsII1GDowLRTtY+rAbJav9R5wwxZiyIQOcetDYKSTH551v9b+Gn4CPw9noQ0bQ==",
507 | "dependencies": {
508 | "axios": "^0.21.1",
509 | "fstream": "^1.0.2",
510 | "metaparser": "^1.0.7",
511 | "mkdirp": "^0.5.0",
512 | "node-unzip-2": "^0.2.7"
513 | },
514 | "engines": {
515 | "node": ">= 0.8.0"
516 | }
517 | },
518 | "node_modules/rimraf": {
519 | "version": "2.7.1",
520 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
521 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
522 | "dependencies": {
523 | "glob": "^7.1.3"
524 | },
525 | "bin": {
526 | "rimraf": "bin.js"
527 | }
528 | },
529 | "node_modules/rimraf/node_modules/glob": {
530 | "version": "7.2.3",
531 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
532 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
533 | "dependencies": {
534 | "fs.realpath": "^1.0.0",
535 | "inflight": "^1.0.4",
536 | "inherits": "2",
537 | "minimatch": "^3.1.1",
538 | "once": "^1.3.0",
539 | "path-is-absolute": "^1.0.0"
540 | },
541 | "engines": {
542 | "node": "*"
543 | },
544 | "funding": {
545 | "url": "https://github.com/sponsors/isaacs"
546 | }
547 | },
548 | "node_modules/setimmediate": {
549 | "version": "1.0.5",
550 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
551 | "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
552 | },
553 | "node_modules/slice-stream": {
554 | "version": "1.0.0",
555 | "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz",
556 | "integrity": "sha512-fJu1TYTr85OZEkT4lqcCW6oPWPIS5omPnIsB/dL7QWo2sNk03VQ6did4plhh0y3Sf0nJlq5QEUR3vMYevydn7w==",
557 | "dependencies": {
558 | "readable-stream": "~1.0.31"
559 | }
560 | },
561 | "node_modules/slice-stream/node_modules/readable-stream": {
562 | "version": "1.0.34",
563 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
564 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
565 | "dependencies": {
566 | "core-util-is": "~1.0.0",
567 | "inherits": "~2.0.1",
568 | "isarray": "0.0.1",
569 | "string_decoder": "~0.10.x"
570 | }
571 | },
572 | "node_modules/slice-stream/node_modules/string_decoder": {
573 | "version": "0.10.31",
574 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
575 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
576 | },
577 | "node_modules/traverse": {
578 | "version": "0.3.9",
579 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
580 | "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==",
581 | "engines": {
582 | "node": "*"
583 | }
584 | },
585 | "node_modules/underscore": {
586 | "version": "1.13.6",
587 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
588 | "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
589 | },
590 | "node_modules/wrappy": {
591 | "version": "1.0.2",
592 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
593 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
594 | }
595 | }
596 | }
597 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cli-real-favicon",
3 | "version": "0.0.9",
4 | "description": "Node.js CLI for RealFaviconGenerator",
5 | "scripts": {
6 | "test": "mocha",
7 | "example": "npm run example:generate && npm run example:inject",
8 | "example:generate": "node ./real-favicon.js generate example/faviconDescription.json example/faviconData.json example/out",
9 | "example:inject": "node ./real-favicon.js inject example/faviconData.json example/out example/*.html"
10 | },
11 | "repository": {
12 | "type": "git",
13 | "url": "git+https://github.com/RealFaviconGenerator/cli-real-favicon.git"
14 | },
15 | "keywords": [
16 | "favicon",
17 | "cli",
18 | "RealFaviconGenerator"
19 | ],
20 | "author": "Philippe Bernard (https://realfavicongenerator.net/)",
21 | "license": "MIT",
22 | "preferGlobal": true,
23 | "bugs": {
24 | "url": "https://github.com/RealFaviconGenerator/cli-real-favicon/issues"
25 | },
26 | "homepage": "https://github.com/RealFaviconGenerator/cli-real-favicon#readme",
27 | "bin": {
28 | "real-favicon": "real-favicon.js"
29 | },
30 | "dependencies": {
31 | "bluebird": "^3.5.5",
32 | "commander": "^2.20.0",
33 | "glob": "^6.0.4",
34 | "rfg-api": "^0.5.3"
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/real-favicon-check-for-update.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | require('./common');
4 |
5 | var program = require('commander');
6 |
7 | var pack = require('./package.json');
8 | var rfg = require('rfg-api').init();
9 | var fs = require('fs');
10 |
11 | var args = program
12 | .version(pack.version)
13 | .option('-f, --fail-on-update', 'Purposefully fail when an update is available')
14 | .arguments('')
15 | .parse(process.argv).args;
16 |
17 | var faviconFile = args[0];
18 |
19 | fs.readFile(faviconFile, function(err, faviconRaw) {
20 | var favicon = JSON.parse(faviconRaw);
21 | var version = favicon.version;
22 |
23 | rfg.changeLog(version, function(err, data) {
24 | if (err) {
25 | throw err;
26 | }
27 |
28 | if (data.length > 0) {
29 | var url = "https://realfavicongenerator.net/change_log?since=" + version;
30 | console.log("An update is available. Visit " + url + " to learn more");
31 |
32 | if (program.failOnUpdate) {
33 | process.exit(1);
34 | }
35 | }
36 | else {
37 | console.log("Your favicon is up-to-date");
38 | }
39 | });
40 | });
41 |
--------------------------------------------------------------------------------
/real-favicon-generate.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | require('./common');
4 |
5 | var program = require('commander');
6 |
7 | var pack = require('./package.json');
8 | var rfg = require('rfg-api').init();
9 | var fs = require('fs');
10 |
11 | var args = program
12 | .version(pack.version)
13 | .command('generate ')
14 | .parse(process.argv).args;
15 |
16 | fs.readFile(args[0], function(err, data) {
17 | if (err) {
18 | throw err;
19 | }
20 |
21 | var favicon = JSON.parse(data);
22 |
23 | var opts = {
24 | apiKey: API_KEY,
25 | masterPicture: favicon.masterPicture,
26 | iconsPath: favicon.iconsPath,
27 | design: favicon.design,
28 | settings: favicon.settings,
29 | versioning: favicon.versioning
30 | };
31 |
32 | var request = rfg.createRequest(opts);
33 |
34 | rfg.generateFavicon(request, args[2], function(err, result) {
35 | if (err) {
36 | throw err;
37 | }
38 |
39 | fs.writeFile(args[1], JSON.stringify(result), function(err) {
40 | if (err) {
41 | throw err;
42 | }
43 |
44 | console.log("Generation completed");
45 | });
46 | });
47 | });
48 |
--------------------------------------------------------------------------------
/real-favicon-inject.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | require('./common');
4 |
5 | var program = require('commander');
6 |
7 | var pack = require('./package.json');
8 | var rfg = require('rfg-api').init();
9 | var path = require('path');
10 | var Promise = require('bluebird');
11 | var fs = Promise.promisifyAll(require('fs'));
12 | var glob = require('glob');
13 |
14 | var args = program
15 | .version(pack.version)
16 | .command('inject ')
17 | .parse(process.argv).args;
18 |
19 | var outputDir = args[1];
20 | var htmlFiles = args.slice(2);
21 |
22 | var markups = fs.readFileAsync(args[0]).then(function(data){
23 | return(JSON.parse(data).favicon.html_code);
24 | });
25 |
26 | Promise.resolve(htmlFiles).map(function(pattern){
27 | return(Promise.fromCallback(function (callback) {
28 | glob(pattern, callback);
29 | }));
30 | }).then(function(fileArrays){
31 | // Flatten array
32 | return([].concat.apply([], fileArrays));
33 | }).map(function(htmlFile) {
34 | return Promise.join(fs.readFileAsync(htmlFile), markups, function(content, markups) {
35 | return(Promise.fromCallback(function (callback) {
36 | rfg.injectFaviconMarkups(content, markups, null, callback);
37 | }));
38 | }).then(function (content) {
39 | return (fs.writeFileAsync(path.join(outputDir, path.basename(htmlFile)), content));
40 | });
41 | }).then(function(){
42 | console.log('Injection completed, ' + htmlFiles.length + ' files were processed');
43 | }).catch(function(err){
44 | console.error(err);
45 | });
46 |
--------------------------------------------------------------------------------
/real-favicon.js:
--------------------------------------------------------------------------------
1 | #! /usr/bin/env node
2 |
3 | 'use strict';
4 |
5 | var program = require('commander');
6 |
7 | var pack = require('./package.json');
8 |
9 | program
10 | .version(pack.version)
11 | .description(
12 | 'A command-line interface for RealFaviconGenerator. ' +
13 | 'Instead of reading some boring documentation, visit ' +
14 | 'https://realfavicongenerator.net/ to generate exactly what you need.')
15 | .command('generate ',
16 | 'Generate favicon images and HTML markups')
17 | .command('inject ',
18 | 'Inject favicon HTML markups into pages')
19 | .command('check-for-update ',
20 | 'Check for updates on RealFaviconGenerator')
21 | .parse(process.argv);
22 |
--------------------------------------------------------------------------------