import { InvalidConfigurationError, isEmptyOrSpaces } from "builder-util" import { sanitizeFileName } from "builder-util/out/filename" import { WinPackager } from "../winPackager" export interface CommonWindowsInstallerConfiguration { readonly oneClick?: boolean /** * Whether to install per all users (per-machine). * @default false */ readonly perMachine?: boolean /** * Whether to run the installed application after finish. For assisted installer corresponding checkbox will be removed. * @default true */ readonly runAfterFinish?: boolean /** * Whether to create desktop shortcut. Set to `always` if to recreate also on reinstall (even if removed by user). * @default true */ readonly createDesktopShortcut?: boolean | "always" /** * Whether to create start menu shortcut. * @default true */ readonly createStartMenuShortcut?: boolean /** * Whether to create submenu for start menu shortcut and program files directory. If `true`, company name will be used. Or string value. * @default false */ readonly menuCategory?: boolean | string /** * The name that will be used for all shortcuts. Defaults to the application name. */ readonly shortcutName?: string | null } export interface FinalCommonWindowsInstallerOptions { isAssisted: boolean isPerMachine: boolean shortcutName: string menuCategory: string | null isCreateDesktopShortcut: DesktopShortcutCreationPolicy isCreateStartMenuShortcut: boolean } export function getEffectiveOptions(options: CommonWindowsInstallerConfiguration, packager: WinPackager): FinalCommonWindowsInstallerOptions { const appInfo = packager.appInfo let menuCategory: string | null = null if (options.menuCategory != null && options.menuCategory !== false) { if (options.menuCategory === true) { const companyName = packager.appInfo.companyName if (companyName == null) { throw new InvalidConfigurationError(`Please specify "author" in the application package.json — it is required because "menuCategory" is set to true.`) } menuCategory = sanitizeFileName(companyName) } else { menuCategory = options.menuCategory .split(/[/\\]/) .map(it => sanitizeFileName(it)) .join("\\") } } return { isPerMachine: options.perMachine === true, isAssisted: options.oneClick === false, shortcutName: isEmptyOrSpaces(options.shortcutName) ? appInfo.sanitizedProductName : packager.expandMacro(options.shortcutName), isCreateDesktopShortcut: convertToDesktopShortcutCreationPolicy(options.createDesktopShortcut), isCreateStartMenuShortcut: options.createStartMenuShortcut !== false, menuCategory, } } function convertToDesktopShortcutCreationPolicy(value: boolean | undefined | string): DesktopShortcutCreationPolicy { if (value === false) { return DesktopShortcutCreationPolicy.NEVER } else if (value === "always") { return DesktopShortcutCreationPolicy.ALWAYS } else { return DesktopShortcutCreationPolicy.FRESH_INSTALL } } export enum DesktopShortcutCreationPolicy { FRESH_INSTALL, ALWAYS, NEVER, }