Browse Source

dev: add ico support

KernelDeimos 5 months ago
parent
commit
90967ab109
3 changed files with 70 additions and 0 deletions
  1. 61 0
      package-lock.json
  2. 2 0
      package.json
  3. 7 0
      src/backend/src/services/AppIconService.js

+ 61 - 0
package-lock.json

@@ -18,6 +18,8 @@
         "json-colorizer": "^3.0.1",
         "open": "^10.1.0",
         "sharp": "^0.33.5",
+        "sharp-bmp": "^0.1.5",
+        "sharp-ico": "^0.1.5",
         "simple-git": "^3.25.0",
         "string-template": "^1.0.0",
         "uuid": "^9.0.1"
@@ -2202,6 +2204,11 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@canvas/image-data": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.0.0.tgz",
+      "integrity": "sha512-BxOqI5LgsIQP1odU5KMwV9yoijleOPzHL18/YvNqF9KFSGF2K/DLlYAbDQsWqd/1nbaFuSkYD/191dpMtNh4vw=="
+    },
     "node_modules/@colors/colors": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
@@ -9439,6 +9446,31 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/decode-bmp": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/decode-bmp/-/decode-bmp-0.2.1.tgz",
+      "integrity": "sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA==",
+      "dependencies": {
+        "@canvas/image-data": "^1.0.0",
+        "to-data-view": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/decode-ico": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/decode-ico/-/decode-ico-0.4.1.tgz",
+      "integrity": "sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==",
+      "dependencies": {
+        "@canvas/image-data": "^1.0.0",
+        "decode-bmp": "^0.2.0",
+        "to-data-view": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
     "node_modules/decompress-response": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
@@ -11519,6 +11551,11 @@
         "ms": "^2.0.0"
       }
     },
+    "node_modules/ico-endec": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/ico-endec/-/ico-endec-0.1.6.tgz",
+      "integrity": "sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ=="
+    },
     "node_modules/iconv-lite": {
       "version": "0.4.24",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -15513,6 +15550,25 @@
         "@img/sharp-win32-x64": "0.33.5"
       }
     },
+    "node_modules/sharp-bmp": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/sharp-bmp/-/sharp-bmp-0.1.5.tgz",
+      "integrity": "sha512-IpWAy+AeTlWNHiBU8HH4atcKbztgKOXTuT4W8aFaeASPCeJwCVpoUymWMfEmwfvWSCOV1s7VmGTlKhcPLkt+Lw==",
+      "dependencies": {
+        "bmp-js": "*",
+        "sharp": "*"
+      }
+    },
+    "node_modules/sharp-ico": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/sharp-ico/-/sharp-ico-0.1.5.tgz",
+      "integrity": "sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q==",
+      "dependencies": {
+        "decode-ico": "*",
+        "ico-endec": "*",
+        "sharp": "*"
+      }
+    },
     "node_modules/sharp/node_modules/color": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
@@ -16331,6 +16387,11 @@
       "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
       "license": "MIT"
     },
+    "node_modules/to-data-view": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz",
+      "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ=="
+    },
     "node_modules/to-regex-range": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",

+ 2 - 0
package.json

@@ -51,6 +51,8 @@
     "json-colorizer": "^3.0.1",
     "open": "^10.1.0",
     "sharp": "^0.33.5",
+    "sharp-bmp": "^0.1.5",
+    "sharp-ico": "^0.1.5",
     "simple-git": "^3.25.0",
     "string-template": "^1.0.0",
     "uuid": "^9.0.1"

+ 7 - 0
src/backend/src/services/AppIconService.js

@@ -25,6 +25,7 @@ class AppIconService extends BaseService {
     static MODULES = {
         sharp: require('sharp'),
         bmp: require('sharp-bmp'),
+        ico: require('sharp-ico'),
     }
 
     /**
@@ -89,6 +90,12 @@ class AppIconService extends BaseService {
             return this.modules.bmp.sharpFromBmp(input);
         }
 
+        const icotypes = ['image/x-icon', 'image/vnd.microsoft.icon'];
+        if ( icotypes.includes(type) ) {
+            const sharps = this.modules.ico.sharpsFromIco(input);
+            return sharps[0];
+        }
+
         return this.modules.sharp(input);
     }