1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.createElectronFrameworkSupport = exports.createBrandingOpts = void 0;
|
4 | const bluebird_lst_1 = require("bluebird-lst");
|
5 | const builder_util_1 = require("builder-util");
|
6 | const fs_1 = require("builder-util/out/fs");
|
7 | const fs_extra_1 = require("fs-extra");
|
8 | const path = require("path");
|
9 | const index_1 = require("../index");
|
10 | const pathManager_1 = require("../util/pathManager");
|
11 | const electronMac_1 = require("./electronMac");
|
12 | const electronVersion_1 = require("./electronVersion");
|
13 | const fs = require("fs/promises");
|
14 | const injectFFMPEG_1 = require("./injectFFMPEG");
|
15 | function createBrandingOpts(opts) {
|
16 | var _a, _b;
|
17 | return {
|
18 | projectName: ((_a = opts.electronBranding) === null || _a === void 0 ? void 0 : _a.projectName) || "electron",
|
19 | productName: ((_b = opts.electronBranding) === null || _b === void 0 ? void 0 : _b.productName) || "Electron",
|
20 | };
|
21 | }
|
22 | exports.createBrandingOpts = createBrandingOpts;
|
23 | function createDownloadOpts(opts, platform, arch, electronVersion) {
|
24 | return {
|
25 | platform,
|
26 | arch,
|
27 | version: electronVersion,
|
28 | ...opts.electronDownload,
|
29 | };
|
30 | }
|
31 | async function beforeCopyExtraFiles(options) {
|
32 | const { appOutDir, packager } = options;
|
33 | const electronBranding = createBrandingOpts(packager.config);
|
34 | if (packager.platform === index_1.Platform.LINUX) {
|
35 | const linuxPackager = packager;
|
36 | const executable = path.join(appOutDir, linuxPackager.executableName);
|
37 | await (0, fs_extra_1.rename)(path.join(appOutDir, electronBranding.projectName), executable);
|
38 | }
|
39 | else if (packager.platform === index_1.Platform.WINDOWS) {
|
40 | const executable = path.join(appOutDir, `${packager.appInfo.productFilename}.exe`);
|
41 | await (0, fs_extra_1.rename)(path.join(appOutDir, `${electronBranding.projectName}.exe`), executable);
|
42 | }
|
43 | else {
|
44 | await (0, electronMac_1.createMacApp)(packager, appOutDir, options.asarIntegrity, options.platformName === "mas");
|
45 | }
|
46 | await removeUnusedLanguagesIfNeeded(options);
|
47 | }
|
48 | async function removeUnusedLanguagesIfNeeded(options) {
|
49 | const { packager: { config, platformSpecificBuildOptions }, } = options;
|
50 | const wantedLanguages = (0, builder_util_1.asArray)(platformSpecificBuildOptions.electronLanguages || config.electronLanguages);
|
51 | if (!wantedLanguages.length) {
|
52 | return;
|
53 | }
|
54 | const { dir, langFileExt } = getLocalesConfig(options);
|
55 |
|
56 | await bluebird_lst_1.default.map((0, fs_extra_1.readdir)(dir), file => {
|
57 | if (!file.endsWith(langFileExt)) {
|
58 | return;
|
59 | }
|
60 | const language = file.substring(0, file.length - langFileExt.length);
|
61 | if (!wantedLanguages.includes(language)) {
|
62 | return fs.rm(path.join(dir, file), { recursive: true, force: true });
|
63 | }
|
64 | return;
|
65 | }, fs_1.CONCURRENCY);
|
66 | function getLocalesConfig(options) {
|
67 | const { appOutDir, packager } = options;
|
68 | if (packager.platform === index_1.Platform.MAC) {
|
69 | return { dir: packager.getResourcesDir(appOutDir), langFileExt: ".lproj" };
|
70 | }
|
71 | else {
|
72 | return { dir: path.join(packager.getResourcesDir(appOutDir), "..", "locales"), langFileExt: ".pak" };
|
73 | }
|
74 | }
|
75 | }
|
76 | class ElectronFramework {
|
77 | constructor(name, version, distMacOsAppName) {
|
78 | this.name = name;
|
79 | this.version = version;
|
80 | this.distMacOsAppName = distMacOsAppName;
|
81 |
|
82 | this.macOsDefaultTargets = ["zip", "dmg"];
|
83 |
|
84 | this.defaultAppIdPrefix = "com.electron.";
|
85 |
|
86 | this.isCopyElevateHelper = true;
|
87 |
|
88 | this.isNpmRebuildRequired = true;
|
89 | }
|
90 | getDefaultIcon(platform) {
|
91 | if (platform === index_1.Platform.LINUX) {
|
92 | return path.join((0, pathManager_1.getTemplatePath)("icons"), "electron-linux");
|
93 | }
|
94 | else {
|
95 |
|
96 | return null;
|
97 | }
|
98 | }
|
99 | async prepareApplicationStageDirectory(options) {
|
100 | await unpack(options, createDownloadOpts(options.packager.config, options.platformName, options.arch, this.version), this.distMacOsAppName);
|
101 | if (options.packager.config.downloadAlternateFFmpeg) {
|
102 | await (0, injectFFMPEG_1.default)(options, this.version);
|
103 | }
|
104 | }
|
105 | beforeCopyExtraFiles(options) {
|
106 | return beforeCopyExtraFiles(options);
|
107 | }
|
108 | }
|
109 | async function createElectronFrameworkSupport(configuration, packager) {
|
110 | let version = configuration.electronVersion;
|
111 | if (version == null) {
|
112 |
|
113 | if (packager.isPrepackedAppAsar) {
|
114 | version = await (0, electronVersion_1.getElectronVersionFromInstalled)(packager.projectDir);
|
115 | if (version == null) {
|
116 | throw new Error(`Cannot compute electron version for prepacked asar`);
|
117 | }
|
118 | }
|
119 | else {
|
120 | version = await (0, electronVersion_1.computeElectronVersion)(packager.projectDir);
|
121 | }
|
122 | configuration.electronVersion = version;
|
123 | }
|
124 | const branding = createBrandingOpts(configuration);
|
125 | return new ElectronFramework(branding.projectName, version, `${branding.productName}.app`);
|
126 | }
|
127 | exports.createElectronFrameworkSupport = createElectronFrameworkSupport;
|
128 | async function unpack(prepareOptions, options, distMacOsAppName) {
|
129 | const { packager, appOutDir, platformName } = prepareOptions;
|
130 | const electronDist = packager.config.electronDist;
|
131 | let dist = typeof electronDist === "function" ? electronDist(prepareOptions) : electronDist;
|
132 | if (dist != null) {
|
133 | const zipFile = `electron-v${options.version}-${platformName}-${options.arch}.zip`;
|
134 | const resolvedDist = path.isAbsolute(dist) ? dist : path.resolve(packager.projectDir, dist);
|
135 | if ((await (0, fs_1.statOrNull)(path.join(resolvedDist, zipFile))) != null) {
|
136 | builder_util_1.log.info({ resolvedDist, zipFile }, "resolved electronDist");
|
137 | options.cache = resolvedDist;
|
138 | dist = null;
|
139 | }
|
140 | }
|
141 | let isFullCleanup = false;
|
142 | if (dist == null) {
|
143 | await (0, builder_util_1.executeAppBuilder)(["unpack-electron", "--configuration", JSON.stringify([options]), "--output", appOutDir, "--distMacOsAppName", distMacOsAppName]);
|
144 | }
|
145 | else {
|
146 | isFullCleanup = true;
|
147 | const source = packager.getElectronSrcDir(dist);
|
148 | const destination = packager.getElectronDestinationDir(appOutDir);
|
149 | builder_util_1.log.info({ source, destination }, "copying Electron");
|
150 | await (0, fs_extra_1.emptyDir)(appOutDir);
|
151 | await (0, fs_1.copyDir)(source, destination, {
|
152 | isUseHardLink: fs_1.DO_NOT_USE_HARD_LINKS,
|
153 | });
|
154 | }
|
155 | await cleanupAfterUnpack(prepareOptions, distMacOsAppName, isFullCleanup);
|
156 | }
|
157 | function cleanupAfterUnpack(prepareOptions, distMacOsAppName, isFullCleanup) {
|
158 | const out = prepareOptions.appOutDir;
|
159 | const isMac = prepareOptions.packager.platform === index_1.Platform.MAC;
|
160 | const resourcesPath = isMac ? path.join(out, distMacOsAppName, "Contents", "Resources") : path.join(out, "resources");
|
161 | return Promise.all([
|
162 | isFullCleanup ? (0, fs_1.unlinkIfExists)(path.join(resourcesPath, "default_app.asar")) : Promise.resolve(),
|
163 | isFullCleanup ? (0, fs_1.unlinkIfExists)(path.join(out, "version")) : Promise.resolve(),
|
164 | isMac
|
165 | ? Promise.resolve()
|
166 | : (0, fs_extra_1.rename)(path.join(out, "LICENSE"), path.join(out, "LICENSE.electron.txt")).catch(() => {
|
167 |
|
168 | }),
|
169 | ]);
|
170 | }
|
171 |
|
\ | No newline at end of file |