"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LinuxTargetHelper = exports.installPrefix = void 0; function _builderUtil() { const data = require("builder-util"); _builderUtil = function () { return data; }; return data; } function _fsExtra() { const data = require("fs-extra"); _fsExtra = function () { return data; }; return data; } function _lazyVal() { const data = require("lazy-val"); _lazyVal = function () { return data; }; return data; } const installPrefix = "/opt"; exports.installPrefix = installPrefix; class LinuxTargetHelper { constructor(packager) { this.packager = packager; this.iconPromise = new (_lazyVal().Lazy)(() => this.computeDesktopIcons()); this.mimeTypeFilesPromise = new (_lazyVal().Lazy)(() => this.computeMimeTypeFiles()); this.maxIconPath = null; } get icons() { return this.iconPromise.value; } get mimeTypeFiles() { return this.mimeTypeFilesPromise.value; } async computeMimeTypeFiles() { const items = []; for (const fileAssociation of this.packager.fileAssociations) { if (!fileAssociation.mimeType) { continue; } const data = ` ${fileAssociation.description ? `${fileAssociation.description}` : ""} `; items.push(data); } if (items.length === 0) { return null; } const file = await this.packager.getTempFile(".xml"); await (0, _fsExtra().outputFile)(file, '\n\n' + items.join("\n") + "\n"); return file; } // must be name without spaces and other special characters, but not product name used async computeDesktopIcons() { const packager = this.packager; const iconDir = packager.platformSpecificBuildOptions.icon; const sources = iconDir == null ? [] : [iconDir]; const commonConfiguration = packager.config; const icnsPath = (commonConfiguration.mac || {}).icon || commonConfiguration.icon; if (icnsPath != null) { sources.push(icnsPath); } // need to put here and not as default because need to resolve image size const result = await packager.resolveIcon(sources, (0, _builderUtil().asArray)(packager.getDefaultFrameworkIcon()), "set"); this.maxIconPath = result[result.length - 1].file; return result; } getDescription(options) { return options.description || this.packager.appInfo.description; } async writeDesktopEntry(targetSpecificOptions, exec, destination, extra) { const data = await this.computeDesktopEntry(targetSpecificOptions, exec, extra); const file = destination || (await this.packager.getTempFile(`${this.packager.appInfo.productFilename}.desktop`)); await (0, _fsExtra().outputFile)(file, data); return file; } async computeDesktopEntry(targetSpecificOptions, exec, extra) { if (exec != null && exec.length === 0) { throw new Error("Specified exec is empty"); } // https://github.com/electron-userland/electron-builder/issues/3418 if (targetSpecificOptions.desktop != null && targetSpecificOptions.desktop.Exec != null) { throw new Error("Please specify executable name as linux.executableName instead of linux.desktop.Exec"); } const packager = this.packager; const appInfo = packager.appInfo; const productFilename = appInfo.productFilename; if (exec == null) { exec = `${installPrefix}/${productFilename}/${packager.executableName}`; if (!/^[/0-9A-Za-z._-]+$/.test(exec)) { exec = `"${exec}"`; } exec += " %U"; } const desktopMeta = Object.assign({ Name: appInfo.productName, Exec: exec, Terminal: "false", Type: "Application", Icon: packager.executableName, // https://askubuntu.com/questions/367396/what-represent-the-startupwmclass-field-of-a-desktop-file // must be set to package.json name (because it is Electron set WM_CLASS) // to get WM_CLASS of running window: xprop WM_CLASS // StartupWMClass doesn't work for unicode // https://github.com/electron/electron/blob/2-0-x/atom/browser/native_window_views.cc#L226 StartupWMClass: appInfo.productName }, extra, targetSpecificOptions.desktop); const description = this.getDescription(targetSpecificOptions); if (!(0, _builderUtil().isEmptyOrSpaces)(description)) { desktopMeta.Comment = description; } const mimeTypes = (0, _builderUtil().asArray)(targetSpecificOptions.mimeTypes); for (const fileAssociation of packager.fileAssociations) { if (fileAssociation.mimeType != null) { mimeTypes.push(fileAssociation.mimeType); } } for (const protocol of (0, _builderUtil().asArray)(packager.config.protocols).concat((0, _builderUtil().asArray)(packager.platformSpecificBuildOptions.protocols))) { for (const scheme of (0, _builderUtil().asArray)(protocol.schemes)) { mimeTypes.push(`x-scheme-handler/${scheme}`); } } if (mimeTypes.length !== 0) { desktopMeta.MimeType = mimeTypes.join(";") + ";"; } let category = targetSpecificOptions.category; if ((0, _builderUtil().isEmptyOrSpaces)(category)) { const macCategory = (packager.config.mac || {}).category; if (macCategory != null) { category = macToLinuxCategory[macCategory]; } if (category == null) { // https://github.com/develar/onshape-desktop-shell/issues/48 if (macCategory != null) { _builderUtil().log.warn({ macCategory }, "cannot map macOS category to Linux. If possible mapping is known for you, please file issue to add it."); } _builderUtil().log.warn({ reason: "linux.category is not set and cannot map from macOS", docs: "https://www.electron.build/configuration/linux" }, "application Linux category is set to default \"Utility\""); category = "Utility"; } } desktopMeta.Categories = `${category}${category.endsWith(";") ? "" : ";"}`; let data = `[Desktop Entry]`; for (const name of Object.keys(desktopMeta)) { data += `\n${name}=${desktopMeta[name]}`; } data += "\n"; return data; } } exports.LinuxTargetHelper = LinuxTargetHelper; const macToLinuxCategory = { "public.app-category.graphics-design": "Graphics", "public.app-category.developer-tools": "Development", "public.app-category.education": "Education", "public.app-category.games": "Game", "public.app-category.video": "Video;AudioVideo", "public.app-category.utilities": "Utility", "public.app-category.social-networking": "Network;Chat", "public.app-category.finance": "Office;Finance" }; // __ts-babel@6.0.4 //# sourceMappingURL=LinuxTargetHelper.js.map