diff --git a/Aptfile b/Aptfile index 83d60ca3..db335a12 100644 --- a/Aptfile +++ b/Aptfile @@ -1,24 +1,3 @@ -debhelper -g++ -gsfonts -libbz2-dev -libexif-dev -libfreetype6-dev -libice-dev -libjbig-dev -libjpeg-dev -liblcms2-dev -libltdl-dev -libpng-dev -libsm-dev -libtiff-dev +libheif-dev +libfftw3-dev libwebp-dev -libwmf-dev -libx11-dev -libxext-dev -libxml2-dev -perl -sharutils -transfig -x11proto-core-dev -zlib1g-dev diff --git a/package-lock.json b/package-lock.json index bc0569a4..e8aeadfb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,6 @@ "graphql": "16.8.1", "graphql-tag": "2.12.6", "image-size": "1.0.2", - "image-to-ascii": "3.2.0", "lodash": "4.17.21", "lru-cache": "10.1.0", "mime-types": "2.1.35", @@ -29,7 +28,7 @@ "p-limit": "3.1.0", "redis": "4.6.11", "request": "2.88.2", - "sharp": "0.32.6", + "sharp": "0.33.0", "winston": "3.11.0" }, "devDependencies": { @@ -2156,6 +2155,21 @@ "kuler": "^2.0.0" } }, + "node_modules/@emnapi/runtime": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.44.0.tgz", + "integrity": "sha512-ZX/etZEZw8DR7zAB1eVQT40lNo0jeqpb6dCgOvctB6FIQ5PoXfMuNY8+ayQfu8tNQbAB8gQWSSJupR8NxeiZXw==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "optional": true + }, "node_modules/@endemolshinegroup/cosmiconfig-typescript-loader": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz", @@ -2750,6 +2764,437 @@ "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", "dev": true }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.0.tgz", + "integrity": "sha512-070tEheekI1LJWTGPC9WlQEa5UoKTXzzlORBHMX4TbfUxMiL336YHR8vBEUNsjse0RJCX8dZ4ZXwT595aEF1ug==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.0.tgz", + "integrity": "sha512-pu/nvn152F3qbPeUkr+4e9zVvEhD3jhwzF473veQfMPkOYo9aoWXSfdZH/E6F+nYC3qvFjbxbvdDbUtEbghLqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.0.tgz", + "integrity": "sha512-VzYd6OwnUR81sInf3alj1wiokY50DjsHz5bvfnsFpxs5tqQxESoHtJO6xyksDs3RIkyhMWq2FufXo6GNSU9BMw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=11", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.0.tgz", + "integrity": "sha512-dD9OznTlHD6aovRswaPNEy8dKtSAmNo4++tO7uuR4o5VxbVAOoEQ1uSmN4iFAdQneTHws1lkTZeiXPrcCkh6IA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=10.13", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.0.tgz", + "integrity": "sha512-VwgD2eEikDJUk09Mn9Dzi1OW2OJFRQK+XlBTkUNmAWPrtj8Ly0yq05DFgu1VCMx2/DqCGQVi5A1dM9hTmxf3uw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.0.tgz", + "integrity": "sha512-xTYThiqEZEZc0PRU90yVtM3KE7lw1bKdnDQ9kCTHWbqWyHOe4NpPOtMGy27YnN51q0J5dqRrvicfPbALIOeAZA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.0.tgz", + "integrity": "sha512-o9E46WWBC6JsBlwU4QyU9578G77HBDT1NInd+aERfxeOPbk0qBZHgoDsQmA2v9TbqJRWzoBPx1aLOhprBMgPjw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.0.tgz", + "integrity": "sha512-naldaJy4hSVhWBgEjfdBY85CAa4UO+W1nx6a1sWStHZ7EUfNiuBTTN2KUYT5dH1+p/xij1t2QSXfCiFJoC5S/Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.0.tgz", + "integrity": "sha512-OdorplCyvmSAPsoJLldtLh3nLxRrkAAAOHsGWGDYfN0kh730gifK+UZb3dWORRa6EusNqCTjfXV4GxvgJ/nPDQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.0.tgz", + "integrity": "sha512-FW8iK6rJrg+X2jKD0Ajhjv6y74lToIBEvkZhl42nZt563FfxkCYacrXZtd+q/sRQDypQLzY5WdLkVTbJoPyqNg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.0.tgz", + "integrity": "sha512-4horD3wMFd5a0ddbDY8/dXU9CaOgHjEHALAddXgafoR5oWq5s8X61PDgsSeh4Qupsdo6ycfPPSSNBrfVQnwwrg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.0" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.0.tgz", + "integrity": "sha512-dcomVSrtgF70SyOr8RCOCQ8XGVThXwe71A1d8MGA+mXEVRJ/J6/TrCbBEJh9ddcEIIsrnrkolaEvYSHqVhswQw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.0" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.0.tgz", + "integrity": "sha512-TiVJbx38J2rNVfA309ffSOB+3/7wOsZYQEOlKqOUdWD/nqkjNGrX+YQGz7nzcf5oy2lC+d37+w183iNXRZNngQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.0" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.0.tgz", + "integrity": "sha512-PaZM4Zi7/Ek71WgTdvR+KzTZpBqrQOFcPe7/8ZoPRlTYYRe43k6TWsf4GVH6XKRLMYeSp8J89RfAhBrSP4itNA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.0" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.0.tgz", + "integrity": "sha512-1QLbbN0zt+32eVrg7bb1lwtvEaZwlhEsY1OrijroMkwAqlHqFj6R33Y47s2XUv7P6Ie1PwCxK/uFnNqMnkd5kg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.0" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.0.tgz", + "integrity": "sha512-CecqgB/CnkvCWFhmfN9ZhPGMLXaEBXl4o7WtA6U3Ztrlh/s7FUKX4vNxpMSYLIrWuuzjiaYdfU3+Tdqh1xaHfw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.0" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.0.tgz", + "integrity": "sha512-Hn4js32gUX9qkISlemZBUPuMs0k/xNJebUNl/L6djnU07B/HAA2KaxRVb3HvbU5fL242hLOcp0+tR+M8dvJUFw==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/runtime": "^0.44.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.0.tgz", + "integrity": "sha512-5HfcsCZi3l5nPRF2q3bllMVMDXBqEWI3Q8KQONfzl0TferFE5lnsIG0A1YrntMAGqvkzdW6y1Ci1A2uTvxhfzg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.0.tgz", + "integrity": "sha512-i3DtP/2ce1yKFj4OzOnOYltOEL/+dp4dc4dJXJBv6god1AFTcmkaA99H/7SwOmkCOBQkbVvA3lCGm3/5nDtf9Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -4026,36 +4471,6 @@ "node": ">=4" } }, - "node_modules/ansy": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/ansy/-/ansy-1.0.15.tgz", - "integrity": "sha512-mQyNSn58HN7aEthofkap0hn8jg7/5SJWrB0ypExgcECOwLppc0njH+QBA9X5VMiEN9SM0JlFZWJQGycxxInAqg==", - "dependencies": { - "ansi-styles": "^3.0.0", - "custom-return": "^1.0.0", - "supports-color": "^3.1.2", - "ul": "^5.2.1" - } - }, - "node_modules/ansy/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansy/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -4246,16 +4661,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-parallel": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/array-parallel/-/array-parallel-0.1.3.tgz", - "integrity": "sha512-TDPTwSWW5E4oiFiKmz6RGJ/a80Y91GuLgUYuLd49+XBS75tYo8PNgaT2K/OxuQYqkoI852MDGBorg9OcUSTQ8w==" - }, - "node_modules/array-series": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/array-series/-/array-series-0.1.5.tgz", - "integrity": "sha512-L0XlBwfx9QetHOsbLDrE/vh2t018w9462HM3iaFfxRiK83aJjAt/Ja3NMkOW7FICwWTlQBa3ZbL5FKhuQWkDrg==" - }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -4373,28 +4778,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asciify-pixel": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/asciify-pixel/-/asciify-pixel-1.2.14.tgz", - "integrity": "sha512-hA7HezbS9Tc1Y/1YaS6IMMOV9k8I1LmTSAu9/F1A4C/JHDc0EJ9MdVxtZTYFNASglS2wC7ekfgavPyXWnetVlA==", - "dependencies": { - "couleurs": "^6.0.0", - "deffy": "^2.2.1", - "pixel-bg": "^1.0.0", - "pixel-class": "^1.0.0", - "pixel-white-bg": "^1.0.0", - "ul": "^5.2.1" - } - }, - "node_modules/asciify-pixel-matrix": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/asciify-pixel-matrix/-/asciify-pixel-matrix-1.0.14.tgz", - "integrity": "sha512-6Lvh2eBWO9pVNhs7tzd+36cHw+QhnOYmCcPKlW4RIKvNnSzbT2kNYUV3qcBxDYr4SKMGkiXFWiNOwW5nY4N/8A==", - "dependencies": { - "asciify-pixel": "^1.0.0", - "ul": "^5.2.1" - } - }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -4411,15 +4794,6 @@ "node": ">=0.8" } }, - "node_modules/assured": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/assured/-/assured-1.0.15.tgz", - "integrity": "sha512-EVb4T+6m5VdlTJ6gbv4WjBM1rHfzXP2BspsQ6VLswcnIQSabjJy7A9YEuG4/KmfF+9OEuT5xhqVJ+V1tClD5ww==", - "dependencies": { - "noop6": "^1.0.1", - "sliced": "^1.0.1" - } - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -4485,11 +4859,6 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -4743,6 +5112,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -4795,6 +5165,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -4908,6 +5279,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -5042,11 +5414,6 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, - "node_modules/cb-buffer": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/cb-buffer/-/cb-buffer-2.1.9.tgz", - "integrity": "sha512-cGPW0zPBLI++nx3iVhC4mkafh7/PsTpNPSLkH0mYs0vlyE3wsyRIP0Uiz4wEGWu0tjd+62kM1muZN6nXUXNRvQ==" - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -5102,11 +5469,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -5374,16 +5736,6 @@ "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true }, - "node_modules/compute-size": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/compute-size/-/compute-size-1.0.13.tgz", - "integrity": "sha512-S/fbgGZII1GRJdYjv6gX+q2x+VhhszvQKkRyxcqI4iSCXpSx68xFHFLR3y/RqvGuFNavni2cMiVp1rQU2Xb6Ag==", - "dependencies": { - "fixed-or-percent": "^1.0.0", - "map-o": "^2.0.1", - "ul": "^5.2.1" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5516,17 +5868,6 @@ "typescript": ">=4" } }, - "node_modules/couleurs": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/couleurs/-/couleurs-6.0.11.tgz", - "integrity": "sha512-y5WUDtgQKw/tVViZCj3ACX8VseU0ONxiet8SRsE89uH4s/otRLXGOMymfVbKMFzedKOdxQpTcYWukRwkvgRYdw==", - "dependencies": { - "ansy": "^1.0.0", - "color-convert": "^1.0.0", - "iterate-object": "^1.3.1", - "typpy": "^2.3.1" - } - }, "node_modules/country-code-emoji": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/country-code-emoji/-/country-code-emoji-2.3.0.tgz", @@ -5661,14 +6002,6 @@ "node": ">= 8" } }, - "node_modules/custom-return": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/custom-return/-/custom-return-1.0.12.tgz", - "integrity": "sha512-Xy6IlEV6gW5Iu4YRoQe0A5RG1mzezawcTXzAk7u28oB2UilRfbbOc1C7RmWE6AJ1inSm8gghCkIpo0LUQfLbvw==", - "dependencies": { - "noop6": "^1.0.0" - } - }, "node_modules/cz-conventional-changelog": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", @@ -5722,20 +6055,6 @@ } } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -5777,14 +6096,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deffy": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.4.tgz", - "integrity": "sha512-pLc9lsbsWjr6RxmJ2OLyvm+9l4j1yK69h+TML/gUit/t3vTijpkNGh8LioaJYTGO7F25m6HZndADcUOo2PsiUg==", - "dependencies": { - "typpy": "^2.0.0" - } - }, "node_modules/define-data-property": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", @@ -6000,6 +6311,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "dependencies": { "once": "^1.4.0" } @@ -6017,14 +6329,6 @@ "node": ">=8.6" } }, - "node_modules/err": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/err/-/err-1.1.1.tgz", - "integrity": "sha512-N97Ybd2jJHVQ+Ft3Q5+C2gM3kgygkdeQmEqbN2z15UTVyyEsIwLA1VK39O1DHEJhXbwIFcJLqm6iARNhFANcQA==", - "dependencies": { - "typpy": "^2.2.0" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -6859,14 +7163,6 @@ "node": ">= 0.8.0" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -7050,11 +7346,6 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" - }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -7258,15 +7549,6 @@ "node": ">= 8" } }, - "node_modules/fixed-or-percent": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fixed-or-percent/-/fixed-or-percent-1.0.12.tgz", - "integrity": "sha512-r4qyzK3pkFHXBn+TYFbHpPKySq5PMejvmnAllScb75SERp3egiK7TVgTe8sgtnMvO/thhVcwz2Ah9Qo/xjmYBQ==", - "dependencies": { - "is-percent": "^1.0.1", - "percent-value": "^1.0.0" - } - }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -7292,25 +7574,6 @@ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, - "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -7358,11 +7621,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -7411,14 +7669,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function.name": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.13.tgz", - "integrity": "sha512-mVrqdoy5npWZyoXl4DxCeuVF6delDcQjVS9aPdvLYlBxtMTZDR2B5GVEQEoM1jJyspCqg3C0v4ABkLE7tp9xFA==", - "dependencies": { - "noop6": "^1.0.1" - } - }, "node_modules/function.prototype.name": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", @@ -7629,11 +7879,6 @@ "assert-plus": "^1.0.0" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -7754,100 +7999,24 @@ "dir-glob": "^3.0.1", "fast-glob": "^3.1.1", "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/gm": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/gm/-/gm-1.25.0.tgz", - "integrity": "sha512-4kKdWXTtgQ4biIo7hZA396HT062nDVVHPjQcurNZ3o/voYN+o5FUC5kOwuORbpExp3XbTJ3SU7iRipiIhQtovw==", - "dependencies": { - "array-parallel": "~0.1.3", - "array-series": "~0.1.5", - "cross-spawn": "^4.0.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gm-installed": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/gm-installed/-/gm-installed-1.0.11.tgz", - "integrity": "sha512-Fc1Pz7/0zDcM6Q5xgFakKRY7I1r7IdRK4KRL2bhK8XedQdI8p28qDKyCnAjAo9/mxaKi/Q6XR80VaSmdVB3b2Q==", - "dependencies": { - "prgm-installed": "^1.0.1" - } - }, - "node_modules/gm-tools": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/gm-tools/-/gm-tools-1.0.12.tgz", - "integrity": "sha512-7LKCMGiAQkmyeCoABd+2VzZHF5aLpFZlWzyhApP9cmRREQ/HHBb9N04O97G1CY1Bbc8+qTl8Y80GcUsJK9vImQ==", - "dependencies": { - "gm": "^1.23.1", - "iterate-object": "^1.3.1", - "pixel-class": "^1.0.0", - "pngjs": "^2.2.0", - "same-time": "^2.3.1" - } - }, - "node_modules/gm/node_modules/cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", - "dependencies": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "node_modules/gm/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/gm/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/gm/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" + "merge2": "^1.3.0", + "slash": "^3.0.0" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gm/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + "node_modules/globby/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/gopd": { "version": "1.0.1", @@ -8294,6 +8463,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -8324,19 +8494,6 @@ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true }, - "node_modules/image-parser": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/image-parser/-/image-parser-1.2.8.tgz", - "integrity": "sha512-kOh01EC1ltKgnVgXdUsZJgjBhSOCLpgVh5TnNcQ5wJFZxi0J7XA0c+mjvMoKHN/sj69qmU4Y+UqRExkYtU6sFA==", - "dependencies": { - "cb-buffer": "^2.0.0", - "err": "^1.1.1", - "gm-tools": "^1.0.0", - "lwipify": "^2.0.0", - "noop6": "^1.0.4", - "pixel-class": "^1.0.0" - } - }, "node_modules/image-size": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", @@ -8351,29 +8508,6 @@ "node": ">=14.0.0" } }, - "node_modules/image-to-ascii": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/image-to-ascii/-/image-to-ascii-3.2.0.tgz", - "integrity": "sha512-qbjPd7CCC713mNKYsyeBxHVTxe88cJuc4og2f1LbS88shbiJBbEO9sPqhtSn8n/mTgiCGUq1IPd9c0Jy3wfCjA==", - "dependencies": { - "asciify-pixel-matrix": "^1.0.14", - "compute-size": "^1.0.13", - "image-parser": "^1.2.8", - "imgpx": "^1.0.13", - "one-by-one": "^3.2.8", - "terminal-char-width": "^1.0.10", - "ul": "^5.2.15" - } - }, - "node_modules/imgpx": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/imgpx/-/imgpx-1.0.13.tgz", - "integrity": "sha512-TkSfwp2a8ZZt7lIk4HgMBY+PjIjoh0Ggrr37R6KjF+D8RXq2FFNfGUhKuAicg7G9bF83oQGeN/Yz/GFepWHxVA==", - "dependencies": { - "lwip-pixels": "^1.0.0", - "lwipify": "^2.0.0" - } - }, "node_modules/immutable": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", @@ -8954,14 +9088,6 @@ "node": ">=8" } }, - "node_modules/is-percent": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/is-percent/-/is-percent-1.0.12.tgz", - "integrity": "sha512-hTBG43Dql3Im4kiSEQm3ciuESBuFdVmPRIq+M6srqhk/YsRoMWRn4ZTcpxDy/VJmMZTjC+Ui37qyoA5JoOLPUA==", - "dependencies": { - "last-char": "^1.3.1" - } - }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -9026,19 +9152,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-ssh/node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" - }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -9170,7 +9283,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/isobject": { "version": "3.0.1", @@ -9357,11 +9471,6 @@ "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==", "dev": true }, - "node_modules/iterate-object": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz", - "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==" - }, "node_modules/iterator.prototype": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", @@ -11214,11 +11323,6 @@ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, - "node_modules/last-char": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/last-char/-/last-char-1.3.11.tgz", - "integrity": "sha512-Thgr0MN085/Eo1UulZKOJy+HMoXSbw9CZ2iPqVxr6nFoIAUo6pkVc25wEU0A8cAz22wv2ZEPrlxhnguBmQ0CPA==" - }, "node_modules/lazy": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", @@ -11819,35 +11923,6 @@ "node": "14 || >=16.14" } }, - "node_modules/lwip-pixels": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/lwip-pixels/-/lwip-pixels-1.1.10.tgz", - "integrity": "sha512-l71xSA39c1VF/Df3CKR2aTVK4G69FRFLjO+b0JhmsjraYLBydVy4utWUpKVG2ZnwIdr6tan9zZ5UrP1zKfCcIg==", - "dependencies": { - "pixel-class": "^1.0.0" - } - }, - "node_modules/lwip2": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/lwip2/-/lwip2-1.0.15.tgz", - "integrity": "sha512-ZZUsudB8PqvoED48F9yiulmhEwiJUfigCad4PVO0da6DlTAEuBNuwWyAQTPToEHYTfFyuY6sirpio7iSosJfNA==", - "hasInstallScript": true, - "dependencies": { - "err": "^1.1.1", - "gm-installed": "^1.0.0" - } - }, - "node_modules/lwipify": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/lwipify/-/lwipify-2.0.13.tgz", - "integrity": "sha512-x8NfMa/Eo6FN3u61lngaPNYAj+4qj5vICyda+Z/BV62agagh4mgI9lLuDGaQSo99Z8hkAbzoSyibSVPSGDFIsw==", - "dependencies": { - "lwip2": "^1.0.0", - "noop6": "^1.0.1", - "tinyreq": "^3.1.4", - "url-remote": "^1.1.0" - } - }, "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -11885,14 +11960,6 @@ "tmpl": "1.0.5" } }, - "node_modules/map-o": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/map-o/-/map-o-2.0.10.tgz", - "integrity": "sha512-BxazE81fVByHWasyXhqKeo2m7bFKYu+ZbEfiuexMOnklXW+tzDvnlTi/JaklEeuuwqcqJzPaf9q+TWptSGXeLg==", - "dependencies": { - "iterate-object": "^1.3.0" - } - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -12018,17 +12085,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -12059,11 +12115,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -12075,11 +12126,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -12116,47 +12162,6 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, - "node_modules/node-abi": { - "version": "3.51.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.51.0.tgz", - "integrity": "sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" - }, "node_modules/node-environment-flags": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", @@ -12271,11 +12276,6 @@ "node": ">=10" } }, - "node_modules/noop6": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.9.tgz", - "integrity": "sha512-DB3Hwyd89dPr5HqEPg3YHjzvwh/mCqizC1zZ8vyofqc+TQRyPDnT4wgXXbLGF4z9YAzwwTLi8pNLhGqcbSjgkA==" - }, "node_modules/nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", @@ -12433,14 +12433,6 @@ "node": "*" } }, - "node_modules/obj-def": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/obj-def/-/obj-def-1.0.9.tgz", - "integrity": "sha512-bQ4ya3VYD6FAA1+s6mEhaURRHSmw4+sKaXE6UyXZ1XDYc5D+c7look25dFdydmLd18epUegh398gdDkMUZI9xg==", - "dependencies": { - "deffy": "^2.2.2" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -12596,15 +12588,6 @@ "wrappy": "1" } }, - "node_modules/one-by-one": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/one-by-one/-/one-by-one-3.2.8.tgz", - "integrity": "sha512-HR/pSzZdm46Xqj58K+Bu64kMbSTw8/u77AwWvV+rprO/OsuR++pPlkUJn+SmwqBGRgHKwSKQ974V3uls7crIeQ==", - "dependencies": { - "obj-def": "^1.0.0", - "sliced": "^1.0.1" - } - }, "node_modules/one-time": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", @@ -12852,15 +12835,6 @@ "node": ">=0.10.0" } }, - "node_modules/parse-url": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-1.3.11.tgz", - "integrity": "sha512-1wj9nkgH/5EboDxLwaTMGJh3oH3f+Gue+aGdh631oCqoSBpokzmMmOldvOeBPtB8GJBYJbaF93KPzlkU+Y1ksg==", - "dependencies": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -12936,11 +12910,6 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, - "node_modules/percent-value": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/percent-value/-/percent-value-1.0.9.tgz", - "integrity": "sha512-AJwr9o+GRtRzbuMPkPBlivc79g6WGz1R0OzeBpUroMWxAxDv6FDi4/NTyPd6TWVxdhG7NACcZpnOaz5vDGRhCw==" - }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -12994,30 +12963,6 @@ "node": ">= 6" } }, - "node_modules/pixel-bg": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pixel-bg/-/pixel-bg-1.0.10.tgz", - "integrity": "sha512-9+ADtdmy3xiza6pZOl5XxAZC4PxxsoG9Te8B7+QJTHVtusRZsbYXCDj4Y/uoKFfVbbn8PwBNfAppPs0fHgu81w==", - "dependencies": { - "pixel-class": "^1.0.0" - } - }, - "node_modules/pixel-class": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pixel-class/-/pixel-class-1.0.10.tgz", - "integrity": "sha512-CVEGjpxCxXW2SdTNyBBnDFFN/IASW5V1buVqCP/omJ1JnOMchsMsu1QsaooTwnSGjrDJTvn0QHNbfewoAagalQ==", - "dependencies": { - "deffy": "^2.2.1" - } - }, - "node_modules/pixel-white-bg": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/pixel-white-bg/-/pixel-white-bg-1.0.9.tgz", - "integrity": "sha512-XiqUYxOC9L0CCr3SuOr2DBpshFVsyuma98bREdk2O92FPhmlBJ9wkWtRqL7eAraCf2/BYDPEL4TjbVMVQNBucw==", - "dependencies": { - "pixel-bg": "^1.0.0" - } - }, "node_modules/pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -13100,66 +13045,6 @@ "semver-compare": "^1.0.0" } }, - "node_modules/pngjs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-2.3.1.tgz", - "integrity": "sha512-ITNPqvx+SSssNFOgHQzGG87HrqQ0g2nMSHc1jjU5Piq9xJEJ40fiFEPz0S5HSSXxBHrTnhaBHIayTO5aRfk2vw==", - "engines": { - "iojs": ">= 1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -13210,25 +13095,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prgm-installed": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/prgm-installed/-/prgm-installed-1.0.11.tgz", - "integrity": "sha512-hmDwovCNtzck+TwA7DdabpPTZCoORTj0PlKcID8gdRlPUNpfTNxRI1x11kpz1K/dXvtCCPMSUJGnYCkXPbZXVQ==", - "dependencies": { - "which": "^1.2.4" - } - }, - "node_modules/prgm-installed/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -13259,11 +13125,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, - "node_modules/protocols": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", - "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -13276,11 +13137,6 @@ "node": ">= 0.10" } }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -13296,6 +13152,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -13367,11 +13224,6 @@ } ] }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -13933,22 +13785,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/same-time": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/same-time/-/same-time-2.3.5.tgz", - "integrity": "sha512-SnVw4CihgrwwcZs38vqW1890OwilOQPnath+kQCX7Un+PfcjR52rThxPfuNpNEd3UrphL22/SleM7hcbiaJu1A==", - "dependencies": { - "deffy": "2.0.0" - } - }, - "node_modules/same-time/node_modules/deffy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.0.0.tgz", - "integrity": "sha512-Gcn10MX982lqx8XmJES2JvN8Im7h0lFwRanyQfkQG2wXko4SouD0pSGUlK6Do165Itfidhpssn6NqlRkKp/4ig==", - "dependencies": { - "typpy": "^2.0.0" - } - }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -14077,25 +13913,42 @@ } }, "node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.0.tgz", + "integrity": "sha512-99DZKudjm/Rmz+M0/26t4DKpXyywAOJaayGS9boEn7FvgtG0RYBi46uPE2c+obcJRtA3AZa0QwJot63gJQ1F0Q==", "hasInstallScript": true, "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=14.15.0" + "libvips": ">=8.15.0", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.0", + "@img/sharp-darwin-x64": "0.33.0", + "@img/sharp-libvips-darwin-arm64": "1.0.0", + "@img/sharp-libvips-darwin-x64": "1.0.0", + "@img/sharp-libvips-linux-arm": "1.0.0", + "@img/sharp-libvips-linux-arm64": "1.0.0", + "@img/sharp-libvips-linux-s390x": "1.0.0", + "@img/sharp-libvips-linux-x64": "1.0.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.0", + "@img/sharp-libvips-linuxmusl-x64": "1.0.0", + "@img/sharp-linux-arm": "0.33.0", + "@img/sharp-linux-arm64": "0.33.0", + "@img/sharp-linux-s390x": "0.33.0", + "@img/sharp-linux-x64": "0.33.0", + "@img/sharp-linuxmusl-arm64": "0.33.0", + "@img/sharp-linuxmusl-x64": "0.33.0", + "@img/sharp-wasm32": "0.33.0", + "@img/sharp-win32-ia32": "0.33.0", + "@img/sharp-win32-x64": "0.33.0" } }, "node_modules/sharp/node_modules/lru-cache": { @@ -14172,49 +14025,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -14329,11 +14139,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==" - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -14456,15 +14261,6 @@ "node": ">= 0.8" } }, - "node_modules/streamx": { - "version": "2.15.5", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.5.tgz", - "integrity": "sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==", - "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -14751,42 +14547,6 @@ "node": ">= 6.0.0" } }, - "node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/terminal-char-width": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/terminal-char-width/-/terminal-char-width-1.0.10.tgz", - "integrity": "sha512-p9H7JIVM2am3v3GfQTKv+Bj1y3YiLVIsv4nfNJtZsbBM+XR4/UUiHvcsvpX+PoBjpD6xSyuX00GUkKgFXXI61A==", - "dependencies": { - "is-windows": "^0.1.1" - } - }, - "node_modules/terminal-char-width/node_modules/is-windows": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.1.1.tgz", - "integrity": "sha512-3wf9CiLayWrH2O5E99jdTwVZyZwVckl+Gz4CkAtjssBPkawQBoPWDEyAHmwZnODQxqYduCBrlGfKQfvE/Mxh+A==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -14818,17 +14578,6 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "node_modules/tinyreq": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/tinyreq/-/tinyreq-3.4.2.tgz", - "integrity": "sha512-VHl9n2w2t1HD9ftvbmYMA99g/yeioIRhpxT5cazb/jo2Vld5ZtPEVW4PhBFgNXjdL2ch8j6z0cawDCF7eIFZsQ==", - "dependencies": { - "assured": "^1.0.12", - "follow-redirects": "^1.4.1", - "noop6": "^1.0.7", - "ul": "^5.2.13" - } - }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -15111,23 +14860,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typpy": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.13.tgz", - "integrity": "sha512-vOxIcQz9sxHi+rT09SJ5aDgVgrPppQjwnnayTrMye1ODaU8gIZTDM19t9TxmEElbMihx2Nq/0/b/MtyKfayRqA==", - "dependencies": { - "function.name": "^1.0.3" - } - }, - "node_modules/ul": { - "version": "5.2.15", - "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.15.tgz", - "integrity": "sha512-svLEUy8xSCip5IWnsRa0UOg+2zP0Wsj4qlbjTmX6GJSmvKMHADBuHOm1dpNkWqWPIGuVSqzUkV3Cris5JrlTRQ==", - "dependencies": { - "deffy": "^2.2.2", - "typpy": "^2.3.4" - } - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -15273,22 +15005,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-local": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/url-local/-/url-local-1.1.9.tgz", - "integrity": "sha512-4SmavOiTqOPjGCkR06kTANhpDfiWDgXWrsjUiygk2lJiEiAa9DL6I6+YwPAKG1ex0XEAkSarl4UnLpPe+cuifA==", - "dependencies": { - "parse-url": "^1.3.0" - } - }, - "node_modules/url-remote": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/url-remote/-/url-remote-1.1.9.tgz", - "integrity": "sha512-pfMfB7yR0bMTx+9XXOXpRix9dEdfrnPA/R2GgdHYnJLeO4RqgxtbKQpFYGBVIXfmFUh/x2ceYxgi9BgUE5tKNA==", - "dependencies": { - "url-local": "^1.0.1" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 9dd83367..2d878c07 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,6 @@ "graphql": "16.8.1", "graphql-tag": "2.12.6", "image-size": "1.0.2", - "image-to-ascii": "3.2.0", "lodash": "4.17.21", "lru-cache": "10.1.0", "mime-types": "2.1.35", @@ -37,7 +36,7 @@ "p-limit": "3.1.0", "redis": "4.6.11", "request": "2.88.2", - "sharp": "0.32.6", + "sharp": "0.33.0", "winston": "3.11.0" }, "scripts": { diff --git a/src/server/controllers/avatar.js b/src/server/controllers/avatar.js index 4de7e2a9..69e07d1f 100644 --- a/src/server/controllers/avatar.js +++ b/src/server/controllers/avatar.js @@ -7,7 +7,7 @@ import mime from 'mime-types'; import { fetchMembersWithCache } from '../lib/graphql'; import { imageRequest } from '../lib/request'; -import { getCloudinaryUrl, parseToBooleanDefaultFalse, parseToBooleanDefaultTrue } from '../lib/utils'; +import { parseToBooleanDefaultFalse, parseToBooleanDefaultTrue } from '../lib/utils'; import { logger } from '../logger'; const debugAvatar = debug('avatar'); @@ -148,11 +148,7 @@ export default async function avatar(req, res) { } // Normal image - let imageUrl = `${process.env.IMAGES_URL}/${user.slug}/avatar/rounded/${maxHeight}.${imageFormat}`; - // Use Cloudinary directly if internal images disabled - if (process.env.DISABLE_BANNER_INTERNAL_IMAGES) { - imageUrl = getCloudinaryUrl(user.image, { height: maxHeight, style: 'rounded', format: imageFormat }); - } + const imageUrl = `${process.env.IMAGES_URL}/${user.slug}/avatar/rounded/${maxHeight}.${imageFormat}`; debugAvatar(`Serving ${imageUrl} for ${user.slug} (type=USER)`); try { if (format === 'svg') { @@ -175,11 +171,7 @@ export default async function avatar(req, res) { } // Default case (likely Organizations) - let imageUrl = `${process.env.IMAGES_URL}/${user.slug}/logo/square/${maxHeight}/${maxWidth}.${imageFormat}`; - // Use Cloudinary directly if internal images disabled - if (process.env.DISABLE_BANNER_INTERNAL_IMAGES) { - imageUrl = getCloudinaryUrl(user.image, { height: maxHeight, width: maxWidth, format: imageFormat }); - } + const imageUrl = `${process.env.IMAGES_URL}/${user.slug}/logo/square/${maxHeight}/${maxWidth}.${imageFormat}`; debugAvatar(`Serving ${imageUrl} for ${user.slug} (default)`); try { if (format === 'svg') { diff --git a/src/server/controllers/index.js b/src/server/controllers/index.js index 52fa7675..a615a207 100644 --- a/src/server/controllers/index.js +++ b/src/server/controllers/index.js @@ -3,6 +3,7 @@ import background from './background'; import badge from './badge'; import banner from './banner'; import logo from './logo'; +import proxy from './proxy'; import website from './website'; export default { @@ -11,5 +12,6 @@ export default { badge, banner, logo, + proxy, website, }; diff --git a/src/server/controllers/logo.js b/src/server/controllers/logo.js index 042bcdc4..6287684b 100644 --- a/src/server/controllers/logo.js +++ b/src/server/controllers/logo.js @@ -8,9 +8,8 @@ import mime from 'mime-types'; import fetch from 'node-fetch'; import sharp from 'sharp'; -import { generateAsciiLogo } from '../lib/ascii-logo'; import { fetchCollectiveWithCache } from '../lib/graphql'; -import { getUiAvatarUrl, parseToBooleanDefaultFalse, parseToBooleanDefaultTrue } from '../lib/utils'; +import { getUiAvatarUrl } from '../lib/utils'; import { logger } from '../logger'; const white = 'white'; @@ -117,31 +116,6 @@ export default async function logo(req, res) { } switch (format) { - case 'txt': - debugLogo(`generating ascii for ${collectiveSlug} from ${imageUrl}`); - generateAsciiLogo(imageUrl, { - bg: parseToBooleanDefaultFalse(req.query.bg), - fg: parseToBooleanDefaultFalse(req.query.fg), - white_bg: parseToBooleanDefaultTrue(req.query.white_bg), - colored: parseToBooleanDefaultTrue(req.query.colored), - size: { - height: params.height || 20, - width: params.width, - }, - variant: req.query.variant || 'wide', - trim: parseToBooleanDefaultTrue(req.query.trim), - reverse: parseToBooleanDefaultFalse(req.query.reverse), - }) - .then((ascii) => { - res.setHeader('content-type', 'text/plain; charset=us-ascii'); - res.send(`${ascii}\n`); - }) - .catch((err) => { - logger.error(`logo: unable to generate ascii for ${collectiveSlug} from ${imageUrl} (${err.message})`); - return res.status(400).send('Unable to create an ASCII art.'); - }); - break; - default: try { const height = params.height || defaultHeight; diff --git a/src/server/controllers/proxy.js b/src/server/controllers/proxy.js new file mode 100644 index 00000000..4febc4cf --- /dev/null +++ b/src/server/controllers/proxy.js @@ -0,0 +1,43 @@ +import debug from 'debug'; +import mime from 'mime-types'; +import fetch from 'node-fetch'; +import sharp from 'sharp'; + +import { isValidUrl } from '../lib/utils'; +import { logger } from '../logger'; + +const debugProxy = debug('proxy'); + +export default async function proxy(req, res) { + const { src: imageUrl, width, height } = req.query; + + if (!isValidUrl(imageUrl)) { + return res.status(400).send('Invalid parameter: "src"'); + } + + debugProxy(`fetching ${imageUrl}`); + const response = await fetch(imageUrl); + if (!response.ok) { + if (response.status === 404) { + logger.info(`proxy: not found ${imageUrl} (status=${response.status} ${response.statusText})`); + } else { + logger.error(`proxy: error processing ${imageUrl} (status=${response.status} ${response.statusText})`); + } + return res.status(response.status).send(response.statusText); + } + const image = await response.buffer(); + if (image.byteLength === 0) { + logger.error(`proxy: error processing ${imageUrl} (Invalid Image)`); + return res.status(400).send('Invalid Image'); + } + + const transparent = { r: 0, g: 0, b: 0, alpha: 0 }; + const resizeWidth = Number(width) || (Number(height) ? undefined : 320); + const resizeHeight = Number(height) || undefined; + const finalFormat = 'png'; + + const sharpImage = sharp(image).resize(resizeWidth, resizeHeight, { fit: 'contain', background: transparent }); + const finalImageBuffer = await sharpImage.toFormat(finalFormat).toBuffer(); + + res.set('Content-Type', mime.lookup(finalFormat)).send(finalImageBuffer); +} diff --git a/src/server/lib/ascii-logo.js b/src/server/lib/ascii-logo.js deleted file mode 100644 index 4bebb663..00000000 --- a/src/server/lib/ascii-logo.js +++ /dev/null @@ -1,39 +0,0 @@ -import Promise from 'bluebird'; -import imageToAscii from 'image-to-ascii'; - -export function generateAsciiLogo(imgsrc, options) { - const variants = { - solid: '█'.split(''), - variant1: ' .,:;i1tfLCG08@'.split(''), - variant2: '@%#*+=-:. '.split('').reverse(), - variant3: '#¥¥®®ØØ$$ø0oo°++=-,. '.split('').reverse(), - variant4: '#WMBRXVYIti+=;:,. '.split('').reverse(), - 'ultra-wide': ( - 'MMMMMMM@@@@@@@WWWWWWWWWBBBBBBBB000000008888888ZZZZZZZZZaZaaaaaa2222222SSS' + - 'SSSSXXXXXXXXXXX7777777rrrrrrr;;;;;;;;iiiiiiiii:::::::,:,,,,,,......... ' - ) - .split('') - .reverse(), - wide: '@@@@@@@######MMMBBHHHAAAA&&GGhh9933XXX222255SSSiiiissssrrrrrrr;;;;;;;;:::::::,,,,,,,........ '.split( - '', - ), - hatching: '##XXxxx+++===---;;,,... '.split('').reverse(), - bits: '# '.split('').reverse(), - binary: '01 '.split('').reverse(), - greyscale: ' ▤▦▩█'.split(''), - blocks: ' ▖▚▜█'.split(''), - }; - - return new Promise((resolve, reject) => { - options.pixels = variants[options.variant || 'wide']; - imageToAscii(imgsrc, options, (err, ascii) => { - if (err) { - return reject(err); - } - if (options.trim) { - ascii = ascii.replace(/\n^\s*$/gm, ''); - } - return resolve(ascii); - }); - }); -} diff --git a/src/server/lib/svg-banner.js b/src/server/lib/svg-banner.js index 7c6fee05..883f90cb 100644 --- a/src/server/lib/svg-banner.js +++ b/src/server/lib/svg-banner.js @@ -6,7 +6,7 @@ import pLimit from 'p-limit'; import { logger } from '../logger'; import { imageRequest } from './request'; -import { getCloudinaryUrl, getWebsite } from './utils'; +import { getWebsite } from './utils'; const WEBSITE_URL = process.env.WEBSITE_URL; @@ -17,10 +17,6 @@ const getImageUrlForUser = (user, height, options) => { return null; } - if (user.image && process.env.DISABLE_BANNER_INTERNAL_IMAGES) { - return getCloudinaryUrl(user.image, { height, style: 'rounded' }); - } - if (user.type === 'GITHUB_USER') { return `${process.env.IMAGES_URL}/github/${user.slug}/avatar/rounded/${height}.png`; } diff --git a/src/server/lib/utils.js b/src/server/lib/utils.js index 05e5eab5..9a360e63 100644 --- a/src/server/lib/utils.js +++ b/src/server/lib/utils.js @@ -1,45 +1,6 @@ import crypto from 'crypto'; import { URL } from 'url'; -export function getCloudinaryUrl(src, { width, height, query, style, format }) { - const cloudinaryHost = 'res.cloudinary.com'; - const cloudinaryResizePath = '/opencollective/image/fetch'; - - if (!format) { - format = 'png'; - } - - if (style === 'rounded') { - query = `/c_thumb,r_max,h_${height},w_${height},bo_2px_solid_rgb:c4c7cc,f_${format}/`; - } - - // We don't try to resize animated gif, svg or images already processed by cloudinary - const parsedURL = new URL(src); // We're supposed to have a valid URL here, so it's ok to throw if it's not - const isCloudinaryUrl = parsedURL.host === cloudinaryHost && parsedURL.pathname === cloudinaryResizePath; - if (isCloudinaryUrl || (process.env.OC_ENV === 'development' && parsedURL.hostname === 'localhost')) { - return src; - } - - if (!query) { - let size = ''; - if (width) { - size += `w_${width},`; - } - if (height) { - size += `h_${height},`; - } - if (size === '') { - size = 'w_320,'; - } - - const format = src.match(/\.png$/) ? 'png' : 'jpg'; - - query = `/${size}c_pad,f_${format}/`; - } - - return `https://${cloudinaryHost}${cloudinaryResizePath}${query}${encodeURIComponent(src)}`; -} - export const queryString = { stringify: (obj) => { let str = ''; diff --git a/src/server/routes.js b/src/server/routes.js index c491c256..7548b9a6 100644 --- a/src/server/routes.js +++ b/src/server/routes.js @@ -1,8 +1,4 @@ -import request from 'request'; - -import { getCloudinaryUrl, isValidUrl } from './lib/utils'; import controllers from './controllers'; -import { logger } from './logger'; import { maxAge } from './middlewares'; const maxAgeOneDay = maxAge(24 * 60 * 60); @@ -14,27 +10,10 @@ export const loadRoutes = (app) => { }); /** - * Proxy all images so that we can serve them from the opencollective.com domain - * and we can cache them at cloudflare level (to reduce bandwidth at cloudinary level) + * Proxy images and resize them on the fly * Format: /proxy/images?src=:encoded_url&width=:width */ - app.get('/proxy/images', maxAge(7200), (req, res) => { - const { src, width, height, query } = req.query; - - if (!isValidUrl(src)) { - return res.status(400).send('Invalid parameter: "src"'); - } - - const url = getCloudinaryUrl(src, { width, height, query }); - - req - .pipe(request(url, { followRedirect: false })) - .on('error', (e) => { - logger.error('>>> Error proxying %s', url, e); - res.status(500).send(e); - }) - .pipe(res); - }); + app.get('/proxy/images', maxAgeOneDay, controllers.proxy); /** * Prevent indexation from search engines diff --git a/test/server/badge.routes.test.js b/test/server/badge.routes.test.js index 720c101f..76cf85a3 100644 --- a/test/server/badge.routes.test.js +++ b/test/server/badge.routes.test.js @@ -130,15 +130,15 @@ describe('badge.routes.test.js', () => { describe('collective logo', () => { test( - 'loads the logo in ascii', + 'loads the logo in png', async () => { - const res = await fetchResponse('/railsgirlsatl/logo.txt'); + const res = await fetchResponse('/railsgirlsatl/logo.png'); expect(res.status).toEqual(200); - expect(res.headers.get('content-type')).toEqual('text/plain; charset=utf-8'); + expect(res.headers.get('content-type')).toEqual('image/png'); expect(res.headers.get('cache-control')).toMatch(/public, max-age=[1-9][0-9]{3,7}/); const text = await res.text(); - expect(text.length).toBeGreaterThan(600); - expect(text.length).toBeLessThan(1000); + expect(text.length).toBeGreaterThan(10000); + expect(text.length).toBeLessThan(20000); }, timeout, );