"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Packager = void 0; function _builderUtil() { const data = require("builder-util"); _builderUtil = function () { return data; }; return data; } function _builderUtilRuntime() { const data = require("builder-util-runtime"); _builderUtilRuntime = function () { return data; }; return data; } function _promise() { const data = require("builder-util/out/promise"); _promise = function () { return data; }; return data; } function _events() { const data = require("events"); _events = function () { return data; }; return data; } function _fsExtra() { const data = require("fs-extra"); _fsExtra = function () { return data; }; return data; } function _isCi() { const data = _interopRequireDefault(require("is-ci")); _isCi = function () { return data; }; return data; } function _lazyVal() { const data = require("lazy-val"); _lazyVal = function () { return data; }; return data; } var path = _interopRequireWildcard(require("path")); function _arch() { const data = require("builder-util/out/arch"); _arch = function () { return data; }; return data; } function _appInfo() { const data = require("./appInfo"); _appInfo = function () { return data; }; return data; } function _asar() { const data = require("./asar/asar"); _asar = function () { return data; }; return data; } function _ElectronFramework() { const data = require("./electron/ElectronFramework"); _ElectronFramework = function () { return data; }; return data; } function _LibUiFramework() { const data = require("./frameworks/LibUiFramework"); _LibUiFramework = function () { return data; }; return data; } function _index() { const data = require("./index"); _index = function () { return data; }; return data; } function _platformPackager() { const data = require("./platformPackager"); _platformPackager = function () { return data; }; return data; } function _ProtonFramework() { const data = require("./ProtonFramework"); _ProtonFramework = function () { return data; }; return data; } function _targetFactory() { const data = require("./targets/targetFactory"); _targetFactory = function () { return data; }; return data; } function _config() { const data = require("./util/config"); _config = function () { return data; }; return data; } function _macroExpander() { const data = require("./util/macroExpander"); _macroExpander = function () { return data; }; return data; } function _packageDependencies() { const data = require("./util/packageDependencies"); _packageDependencies = function () { return data; }; return data; } function _packageMetadata() { const data = require("./util/packageMetadata"); _packageMetadata = function () { return data; }; return data; } function _repositoryInfo() { const data = require("./util/repositoryInfo"); _repositoryInfo = function () { return data; }; return data; } function _yarn() { const data = require("./util/yarn"); _yarn = function () { return data; }; return data; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function addHandler(emitter, event, handler) { emitter.on(event, handler); } async function createFrameworkInfo(configuration, packager) { let framework = configuration.framework; if (framework != null) { framework = framework.toLowerCase(); } let nodeVersion = configuration.nodeVersion; if (framework === "electron" || framework == null) { return await (0, _ElectronFramework().createElectronFrameworkSupport)(configuration, packager); } if (nodeVersion == null || nodeVersion === "current") { nodeVersion = process.versions.node; } const distMacOsName = `${packager.appInfo.productFilename}.app`; const isUseLaunchUi = configuration.launchUiVersion !== false; if (framework === "proton" || framework === "proton-native") { return new (_ProtonFramework().ProtonFramework)(nodeVersion, distMacOsName, isUseLaunchUi); } else if (framework === "libui") { return new (_LibUiFramework().LibUiFramework)(nodeVersion, distMacOsName, isUseLaunchUi); } else { throw new (_builderUtil().InvalidConfigurationError)(`Unknown framework: ${framework}`); } } class Packager { //noinspection JSUnusedGlobalSymbols constructor(options, cancellationToken = new (_builderUtilRuntime().CancellationToken)()) { this.cancellationToken = cancellationToken; this._metadata = null; this._nodeModulesHandledExternally = false; this._isPrepackedAppAsar = false; this._devMetadata = null; this._configuration = null; this.isTwoPackageJsonProjectLayoutUsed = false; this.eventEmitter = new (_events().EventEmitter)(); this._appInfo = null; this.tempDirManager = new (_builderUtil().TmpDir)("packager"); this._repositoryInfo = new (_lazyVal().Lazy)(() => (0, _repositoryInfo().getRepositoryInfo)(this.projectDir, this.metadata, this.devMetadata)); this.afterPackHandlers = []; this.debugLogger = new (_builderUtil().DebugLogger)(_builderUtil().log.isDebugEnabled); this.nodeDependencyInfo = new Map(); this.stageDirPathCustomizer = (target, packager, arch) => { return path.join(target.outDir, `__${target.name}-${(0, _arch().getArtifactArchName)(arch, target.name)}`); }; this._buildResourcesDir = null; this._framework = null; this.toDispose = []; if ("devMetadata" in options) { throw new (_builderUtil().InvalidConfigurationError)("devMetadata in the options is deprecated, please use config instead"); } if ("extraMetadata" in options) { throw new (_builderUtil().InvalidConfigurationError)("extraMetadata in the options is deprecated, please use config.extraMetadata instead"); } const targets = options.targets || new Map(); if (options.targets == null) { options.targets = targets; } function processTargets(platform, types) { function commonArch(currentIfNotSpecified) { if (platform === _index().Platform.MAC) { return currentIfNotSpecified ? [_builderUtil().Arch.x64] : []; } const result = Array(); return result.length === 0 && currentIfNotSpecified ? [(0, _builderUtil().archFromString)(process.arch)] : result; } let archToType = targets.get(platform); if (archToType == null) { archToType = new Map(); targets.set(platform, archToType); } if (types.length === 0) { for (const arch of commonArch(false)) { archToType.set(arch, []); } return; } for (const type of types) { const suffixPos = type.lastIndexOf(":"); if (suffixPos > 0) { (0, _builderUtil().addValue)(archToType, (0, _builderUtil().archFromString)(type.substring(suffixPos + 1)), type.substring(0, suffixPos)); } else { for (const arch of commonArch(true)) { (0, _builderUtil().addValue)(archToType, arch, type); } } } } if (options.mac != null) { processTargets(_index().Platform.MAC, options.mac); } if (options.linux != null) { processTargets(_index().Platform.LINUX, options.linux); } if (options.win != null) { processTargets(_index().Platform.WINDOWS, options.win); } this.projectDir = options.projectDir == null ? process.cwd() : path.resolve(options.projectDir); this._appDir = this.projectDir; this.options = Object.assign({}, options, { prepackaged: options.prepackaged == null ? null : path.resolve(this.projectDir, options.prepackaged) }); try { _builderUtil().log.info({ version: "21.1.5", os: require("os").release() }, "electron-builder"); } catch (e) { // error in dev mode without babel if (!(e instanceof ReferenceError)) { throw e; } } } get appDir() { return this._appDir; } get metadata() { return this._metadata; } get areNodeModulesHandledExternally() { return this._nodeModulesHandledExternally; } get isPrepackedAppAsar() { return this._isPrepackedAppAsar; } get devMetadata() { return this._devMetadata; } get config() { return this._configuration; } get appInfo() { return this._appInfo; } get repositoryInfo() { return this._repositoryInfo.value; } getNodeDependencyInfo(platform) { let key = ""; let excludedDependencies = null; if (platform != null && this.framework.getExcludedDependencies != null) { excludedDependencies = this.framework.getExcludedDependencies(platform); if (excludedDependencies != null) { key += `-${platform.name}`; } } let result = this.nodeDependencyInfo.get(key); if (result == null) { result = (0, _packageDependencies().createLazyProductionDeps)(this.appDir, excludedDependencies); this.nodeDependencyInfo.set(key, result); } return result; } get buildResourcesDir() { let result = this._buildResourcesDir; if (result == null) { result = path.resolve(this.projectDir, this.relativeBuildResourcesDirname); this._buildResourcesDir = result; } return result; } get relativeBuildResourcesDirname() { return this.config.directories.buildResources; } get framework() { return this._framework; } disposeOnBuildFinish(disposer) { this.toDispose.push(disposer); } addAfterPackHandler(handler) { this.afterPackHandlers.push(handler); } artifactCreated(handler) { addHandler(this.eventEmitter, "artifactCreated", handler); return this; } async callArtifactBuildStarted(event, logFields) { _builderUtil().log.info(logFields || { target: event.targetPresentableName, arch: event.arch == null ? null : _builderUtil().Arch[event.arch], file: _builderUtil().log.filePath(event.file) }, "building"); const handler = (0, _platformPackager().resolveFunction)(this.config.artifactBuildStarted, "artifactBuildStarted"); if (handler != null) { await Promise.resolve(handler(event)); } } /** * Only for sub artifacts (update info), for main artifacts use `callArtifactBuildCompleted`. */ dispatchArtifactCreated(event) { this.eventEmitter.emit("artifactCreated", event); } async callArtifactBuildCompleted(event) { this.dispatchArtifactCreated(event); const handler = (0, _platformPackager().resolveFunction)(this.config.artifactBuildCompleted, "artifactBuildCompleted"); if (handler != null) { await Promise.resolve(handler(event)); } } async build() { let configPath = null; let configFromOptions = this.options.config; if (typeof configFromOptions === "string") { // it is a path to config file configPath = configFromOptions; configFromOptions = null; } else if (configFromOptions != null && configFromOptions.extends != null && configFromOptions.extends.includes(".")) { configPath = configFromOptions.extends; delete configFromOptions.extends; } const projectDir = this.projectDir; const devPackageFile = path.join(projectDir, "package.json"); this._devMetadata = await (0, _promise().orNullIfFileNotExist)((0, _packageMetadata().readPackageJson)(devPackageFile)); const devMetadata = this.devMetadata; const configuration = await (0, _config().getConfig)(projectDir, configPath, configFromOptions, new (_lazyVal().Lazy)(() => Promise.resolve(devMetadata))); if (_builderUtil().log.isDebugEnabled) { _builderUtil().log.debug({ config: getSafeEffectiveConfig(configuration) }, "effective config"); } this._appDir = await (0, _config().computeDefaultAppDirectory)(projectDir, configuration.directories.app); this.isTwoPackageJsonProjectLayoutUsed = this._appDir !== projectDir; const appPackageFile = this.isTwoPackageJsonProjectLayoutUsed ? path.join(this.appDir, "package.json") : devPackageFile; // tslint:disable:prefer-conditional-expression if (this.devMetadata != null && !this.isTwoPackageJsonProjectLayoutUsed) { this._metadata = this.devMetadata; } else { this._metadata = await this.readProjectMetadataIfTwoPackageStructureOrPrepacked(appPackageFile); } (0, _builderUtil().deepAssign)(this.metadata, configuration.extraMetadata); if (this.isTwoPackageJsonProjectLayoutUsed) { _builderUtil().log.debug({ devPackageFile, appPackageFile }, "two package.json structure is used"); } (0, _packageMetadata().checkMetadata)(this.metadata, this.devMetadata, appPackageFile, devPackageFile); return await this._build(configuration, this._metadata, this._devMetadata); } // external caller of this method always uses isTwoPackageJsonProjectLayoutUsed=false and appDir=projectDir, no way (and need) to use another values async _build(configuration, metadata, devMetadata, repositoryInfo) { await (0, _config().validateConfig)(configuration, this.debugLogger); this._configuration = configuration; this._metadata = metadata; this._devMetadata = devMetadata; if (repositoryInfo != null) { this._repositoryInfo.value = Promise.resolve(repositoryInfo); } this._appInfo = new (_appInfo().AppInfo)(this, null); this._framework = await createFrameworkInfo(this.config, this); const commonOutDirWithoutPossibleOsMacro = path.resolve(this.projectDir, (0, _macroExpander().expandMacro)(configuration.directories.output, null, this._appInfo, { os: "" })); if (!_isCi().default && process.stdout.isTTY) { const effectiveConfigFile = path.join(commonOutDirWithoutPossibleOsMacro, "builder-effective-config.yaml"); _builderUtil().log.info({ file: _builderUtil().log.filePath(effectiveConfigFile) }, "writing effective config"); await (0, _fsExtra().outputFile)(effectiveConfigFile, getSafeEffectiveConfig(configuration)); } // because artifact event maybe dispatched several times for different publish providers const artifactPaths = new Set(); this.artifactCreated(event => { if (event.file != null) { artifactPaths.add(event.file); } }); this.disposeOnBuildFinish(() => this.tempDirManager.cleanup()); const platformToTargets = await (0, _promise().executeFinally)(this.doBuild(), async () => { if (this.debugLogger.isEnabled) { await this.debugLogger.save(path.join(commonOutDirWithoutPossibleOsMacro, "builder-debug.yml")); } const toDispose = this.toDispose.slice(); this.toDispose.length = 0; for (const disposer of toDispose) { await disposer().catch(e => { _builderUtil().log.warn({ error: e }, "cannot dispose"); }); } }); return { outDir: commonOutDirWithoutPossibleOsMacro, artifactPaths: Array.from(artifactPaths), platformToTargets, configuration }; } async readProjectMetadataIfTwoPackageStructureOrPrepacked(appPackageFile) { let data = await (0, _promise().orNullIfFileNotExist)((0, _packageMetadata().readPackageJson)(appPackageFile)); if (data != null) { return data; } data = await (0, _promise().orNullIfFileNotExist)((0, _asar().readAsarJson)(path.join(this.projectDir, "app.asar"), "package.json")); if (data != null) { this._isPrepackedAppAsar = true; return data; } throw new Error(`Cannot find package.json in the ${path.dirname(appPackageFile)}`); } async doBuild() { const taskManager = new (_builderUtil().AsyncTaskManager)(this.cancellationToken); const platformToTarget = new Map(); const createdOutDirs = new Set(); for (const [platform, archToType] of this.options.targets) { if (this.cancellationToken.cancelled) { break; } if (platform === _index().Platform.MAC && process.platform === _index().Platform.WINDOWS.nodeName) { throw new (_builderUtil().InvalidConfigurationError)("Build for macOS is supported only on macOS, please see https://electron.build/multi-platform-build"); } const packager = this.createHelper(platform); const nameToTarget = new Map(); platformToTarget.set(platform, nameToTarget); for (const [arch, targetNames] of (0, _targetFactory().computeArchToTargetNamesMap)(archToType, packager, platform)) { if (this.cancellationToken.cancelled) { break; } await this.installAppDependencies(platform, arch); if (this.cancellationToken.cancelled) { break; } // support os and arch macro in output value const outDir = path.resolve(this.projectDir, packager.expandMacro(this._configuration.directories.output, _builderUtil().Arch[arch])); const targetList = (0, _targetFactory().createTargets)(nameToTarget, targetNames.length === 0 ? packager.defaultTarget : targetNames, outDir, packager); await createOutDirIfNeed(targetList, createdOutDirs); await packager.pack(outDir, arch, targetList, taskManager); } if (this.cancellationToken.cancelled) { break; } for (const target of nameToTarget.values()) { taskManager.addTask(target.finishBuild()); } } await taskManager.awaitTasks(); return platformToTarget; } createHelper(platform) { if (this.options.platformPackagerFactory != null) { return this.options.platformPackagerFactory(this, platform); } switch (platform) { case _index().Platform.MAC: { const helperClass = require("./macPackager").default; return new helperClass(this); } case _index().Platform.WINDOWS: { const helperClass = require("./winPackager").WinPackager; return new helperClass(this); } case _index().Platform.LINUX: return new (require("./linuxPackager").LinuxPackager)(this); default: throw new Error(`Unknown platform: ${platform}`); } } async installAppDependencies(platform, arch) { if (this.options.prepackaged != null || this.framework.isNpmRebuildRequired !== true) { return; } const frameworkInfo = { version: this.framework.version, useCustomDist: true }; const config = this.config; if (config.nodeGypRebuild === true) { _builderUtil().log.info({ arch: _builderUtil().Arch[arch] }, "executing node-gyp rebuild"); await (0, _builderUtil().exec)(process.platform === "win32" ? "node-gyp.cmd" : "node-gyp", ["rebuild"], { env: (0, _yarn().getGypEnv)(frameworkInfo, platform.nodeName, _builderUtil().Arch[arch], true) }); } if (config.npmRebuild === false) { _builderUtil().log.info({ reason: "npmRebuild is set to false" }, "skipped dependencies rebuild"); return; } const beforeBuild = (0, _platformPackager().resolveFunction)(config.beforeBuild, "beforeBuild"); if (beforeBuild != null) { const performDependenciesInstallOrRebuild = await beforeBuild({ appDir: this.appDir, electronVersion: this.config.electronVersion, platform, arch: _builderUtil().Arch[arch] }); // If beforeBuild resolves to false, it means that handling node_modules is done outside of electron-builder. this._nodeModulesHandledExternally = !performDependenciesInstallOrRebuild; if (!performDependenciesInstallOrRebuild) { return; } } if (config.buildDependenciesFromSource === true && platform.nodeName !== process.platform) { _builderUtil().log.info({ reason: "platform is different and buildDependenciesFromSource is set to true" }, "skipped dependencies rebuild"); } else { await (0, _yarn().installOrRebuild)(config, this.appDir, { frameworkInfo, platform: platform.nodeName, arch: _builderUtil().Arch[arch], productionDeps: this.getNodeDependencyInfo(null) }); } } async afterPack(context) { const afterPack = (0, _platformPackager().resolveFunction)(this.config.afterPack, "afterPack"); const handlers = this.afterPackHandlers.slice(); if (afterPack != null) { // user handler should be last handlers.push(afterPack); } for (const handler of handlers) { await Promise.resolve(handler(context)); } } } exports.Packager = Packager; function createOutDirIfNeed(targetList, createdOutDirs) { const ourDirs = new Set(); for (const target of targetList) { // noinspection SuspiciousInstanceOfGuard if (target instanceof _targetFactory().NoOpTarget) { continue; } const outDir = target.outDir; if (!createdOutDirs.has(outDir)) { ourDirs.add(outDir); } } if (ourDirs.size === 0) { return Promise.resolve(); } return Promise.all(Array.from(ourDirs).sort().map(dir => { return (0, _fsExtra().mkdirs)(dir).then(() => (0, _fsExtra().chmod)(dir, 0o755) /* set explicitly */ ).then(() => createdOutDirs.add(dir)); })); } function getSafeEffectiveConfig(configuration) { const o = JSON.parse((0, _builderUtil().safeStringifyJson)(configuration)); if (o.cscLink != null) { o.cscLink = ""; } return (0, _builderUtil().serializeToYaml)(o, true); } // __ts-babel@6.0.4 //# sourceMappingURL=packager.js.map