mirror of
https://github.com/abusoww/tuxmate.git
synced 2026-04-17 15:53:24 +02:00
87 lines
3.5 KiB
TypeScript
87 lines
3.5 KiB
TypeScript
// Main entry point for generating install scripts.
|
|
// Each distro has its own module - keeps things sane.
|
|
|
|
import { distros, type DistroId } from './data';
|
|
import {
|
|
getSelectedPackages,
|
|
generateUbuntuScript,
|
|
generateDebianScript,
|
|
generateArchScript,
|
|
generateFedoraScript,
|
|
generateOpenSUSEScript,
|
|
generateNixScript,
|
|
generateFlatpakScript,
|
|
generateSnapScript,
|
|
generateHomebrewScript,
|
|
} from './scripts';
|
|
|
|
interface ScriptOptions {
|
|
distroId: DistroId;
|
|
selectedAppIds: Set<string>;
|
|
helper?: 'yay' | 'paru';
|
|
}
|
|
|
|
/**
|
|
* Generate a full install script with progress bars, error handling,
|
|
* and all the fancy stuff. This is what gets downloaded as .sh file.
|
|
*/
|
|
export function generateInstallScript(options: ScriptOptions): string {
|
|
const { distroId, selectedAppIds, helper = 'yay' } = options;
|
|
const distro = distros.find(d => d.id === distroId);
|
|
|
|
if (!distro) return '#!/bin/bash\necho "Error: Unknown distribution"\nexit 1';
|
|
|
|
const packages = getSelectedPackages(selectedAppIds, distroId);
|
|
if (packages.length === 0) return '#!/bin/bash\necho "No packages selected"\nexit 0';
|
|
|
|
switch (distroId) {
|
|
case 'ubuntu': return generateUbuntuScript(packages);
|
|
case 'debian': return generateDebianScript(packages);
|
|
case 'arch': return generateArchScript(packages, helper);
|
|
case 'fedora': return generateFedoraScript(packages);
|
|
case 'opensuse': return generateOpenSUSEScript(packages);
|
|
case 'nix': return generateNixScript(packages);
|
|
case 'flatpak': return generateFlatpakScript(packages);
|
|
case 'snap': return generateSnapScript(packages);
|
|
case 'homebrew': return generateHomebrewScript(packages);
|
|
default: return '#!/bin/bash\necho "Unsupported distribution"\nexit 1';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Quick one-liner for the clipboard. No frills, just the command.
|
|
* For users who know what they're doing and just want to paste.
|
|
*/
|
|
export function generateSimpleCommand(selectedAppIds: Set<string>, distroId: DistroId): string {
|
|
const packages = getSelectedPackages(selectedAppIds, distroId);
|
|
if (packages.length === 0) return '# No packages selected';
|
|
|
|
const pkgList = packages.map(p => p.pkg).join(' ');
|
|
|
|
switch (distroId) {
|
|
case 'ubuntu':
|
|
case 'debian': return `sudo apt install -y ${pkgList}`;
|
|
case 'arch': return `yay -S --needed --noconfirm ${pkgList}`;
|
|
case 'fedora': return `sudo dnf install -y ${pkgList}`;
|
|
case 'opensuse': return `sudo zypper install -y ${pkgList}`;
|
|
case 'nix': return `nix-env -iA ${packages.filter(p => p.pkg.trim()).map(p => `nixpkgs.${p.pkg.trim()}`).join(' ')}`;
|
|
case 'flatpak': return `flatpak install flathub -y ${pkgList}`;
|
|
case 'snap':
|
|
if (packages.length === 1) return `sudo snap install ${pkgList}`;
|
|
return packages.map(p => `sudo snap install ${p.pkg}`).join(' && ');
|
|
case 'homebrew': {
|
|
const formulae = packages.filter(p => !p.pkg.startsWith('--cask '));
|
|
const casks = packages.filter(p => p.pkg.startsWith('--cask '));
|
|
const parts = [];
|
|
if (formulae.length > 0) {
|
|
parts.push(`brew install ${formulae.map(p => p.pkg).join(' ')}`);
|
|
}
|
|
if (casks.length > 0) {
|
|
parts.push(`brew install --cask ${casks.map(p => p.pkg.replace('--cask ', '')).join(' ')}`);
|
|
}
|
|
return parts.join(' && ') || '# No packages selected';
|
|
}
|
|
default: return `# Install: ${pkgList}`;
|
|
}
|
|
}
|