├── .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 | ![RealFaviconGenerator's favicon editor](https://cloud.githubusercontent.com/assets/423852/11326158/fef7c99c-9161-11e5-8491-6083d5fc6dc6.png) 12 | 13 | - On the result page, click the Node CLI tab. Follow the instructions to setup your favicon in your Gulp project: 14 | 15 | ![Result page, Gulp tab](https://cloud.githubusercontent.com/assets/423852/11326161/02a2842e-9162-11e5-90d6-9865e2a73371.png) 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 | --------------------------------------------------------------------------------