import log from 'loglevel'; import chalk from 'chalk'; import { program } from 'commander'; import { PakeCliOptions } from './types'; import handleInputOptions from './options/index'; import BuilderProvider from './builders/BuilderProvider'; import { checkUpdateTips } from './helpers/updater'; import packageJson from '../package.json'; import { validateNumberInput, validateUrlInput } from './utils/validate'; import { DEFAULT_PAKE_OPTIONS as DEFAULT } from './defaults'; program .description(chalk.green('Pake: A CLI that can turn any webpage into a desktop app with Rust.')) .usage('[url] [options]') .showHelpAfterError(); program .argument('[url]', 'The web URL you want to package', validateUrlInput) .option('--name ', 'Application name') .option('--icon ', 'Application icon', DEFAULT.icon) .option('--height ', 'Window height', validateNumberInput, DEFAULT.height) .option('--width ', 'Window width', validateNumberInput, DEFAULT.width) .option('--resizable', 'Whether the window can be resizable', DEFAULT.resizable) .option('--fullscreen', 'Start the packaged app in full screen', DEFAULT.fullscreen) .option('--transparent', 'Transparent title bar', DEFAULT.transparent) .option('--user-agent ', 'Custom user agent', DEFAULT.userAgent) .option('--show-menu', 'Show menu in app', DEFAULT.showMenu) .option('--show-system-tray', 'Show system tray in app', DEFAULT.showSystemTray) .option('--system-tray-icon ', 'Custom system tray icon', DEFAULT.systemTrayIcon) .option('--iter-copy-file', 'Copy files to app when URL is a local file', DEFAULT.iterCopyFile) .option('--multi-arch', 'Only for Mac, supports both Intel and M1', DEFAULT.multiArch) .option('--targets ', 'Only for Linux, option "deb", "appimage" or "all"', DEFAULT.targets) .option('--debug', 'Debug mode', DEFAULT.debug) .version(packageJson.version, '-v, --version', 'Output the current version') .action(async (url: string, options: PakeCliOptions) => { await checkUpdateTips(); if (!url) { program.outputHelp((str) => { const filteredOutput = str .split('\n') .filter((line) => !/((-h,|--help)|((-v|-V),|--version))\s+.+$/.test(line)) .join('\n'); return filteredOutput.trim(); // Trim any leading/trailing whitespace }); process.exit(0); } log.setDefaultLevel('info'); if (options.debug) { log.setLevel('debug'); } const appOptions = await handleInputOptions(options, url); log.debug('PakeAppOptions', appOptions); const builder = BuilderProvider.create(); await builder.prepare(); await builder.build(url, appOptions); }); program.parse();