import Foundation func checkDependencies() -> Bool { print("--- DEPENDENCIES -----------------------------------") print(" ") defer { print(" ") } var valid = true valid = checkImageOptimAvailability() && valid valid = checkMagickAvailability() && valid valid = checkCwebpAvailability() && valid valid = checkAvifAvailability() && valid valid = checkUglifyJsAvailability() && valid valid = checkCleanCssAvailability() && valid return valid } private func checkImageOptimAvailability() -> Bool { do { let output = try safeShell("imageoptim --version") let version = output.components(separatedBy: ".").compactMap { Int($0.trimmed) } if version.count > 1 { print(" ImageOptim: \(version.map { "\($0)" }.joined(separator: "."))") } else { print(" ImageOptim: Not found, download app from https://imageoptim.com/mac and install using 'npm install imageoptim-cli'") return false } } catch { print(" ImageOptim: Failed to get version (\(error))") return false } return true } private func checkMagickAvailability() -> Bool { do { let output = try safeShell("magick --version") guard let version = output.components(separatedBy: "ImageMagick ").dropFirst().first? .components(separatedBy: " ").first else { print(" Magick: Not found, install using 'brew install imagemagick'") return false } print(" Magick: \(version)") } catch { print(" Magick: Failed to get version (\(error))") return false } return true } private func checkCwebpAvailability() -> Bool { do { let output = try safeShell("cwebp -version") let version = output.components(separatedBy: ".").compactMap { Int($0.trimmed) } if version.count > 1 { print(" cwebp: \(version.map { "\($0)" }.joined(separator: "."))") } else { print(" cwebp: Not found, download from https://developers.google.com/speed/webp/download") return false } } catch { print(" cwebp: Failed to get version (\(error))") return false } return true } private func checkAvifAvailability() -> Bool { do { let output = try safeShell("npx avif --version") let version = output.components(separatedBy: ".").compactMap { Int($0.trimmed) } if version.count > 1 { print(" avif: \(version.map { "\($0)" }.joined(separator: "."))") } else { print(" avif: Not found, install using 'npm install avif'") return false } } catch { print(" avif: Failed to get version (\(error))") return false } return true } private func checkUglifyJsAvailability() -> Bool { do { let output = try safeShell("uglifyjs --version") let version = output.dropBeforeFirst("uglify-js").components(separatedBy: ".").compactMap { Int($0.trimmed) } if version.count > 1 { print(" uglify-js: \(version.map { "\($0)" }.joined(separator: "."))") } else { print("'\(output)'") print(" uglify-js: Not found, install using 'npm install uglify-js'") return false } } catch { print(" uglify-js: Failed to get version (\(error))") return false } return true } private func checkCleanCssAvailability() -> Bool { do { let output = try safeShell("cleancss --version") let version = output.components(separatedBy: ".").compactMap { Int($0.trimmed) } if version.count > 1 { print(" cleancss: \(version.map { "\($0)" }.joined(separator: "."))") } else { print(" cleancss: Not found, install using 'npm install clean-css-cli'") return false } } catch { print(" cleancss: Failed to get version (\(error))") return false } return true }