UNPKG

electron-builder-lib

Version:
765 lines (577 loc) 21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Packager = void 0; function _bluebirdLst() { const data = _interopRequireWildcard(require("bluebird-lst")); _bluebirdLst = function () { return data; }; return data; } 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 _fs() { const data = require("builder-util/out/fs"); _fs = 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 _fsExtraP() { const data = require("fs-extra-p"); _fsExtraP = 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 _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 _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; } let createFrameworkInfo = (() => { var _ref = (0, _bluebirdLst().coroutine)(function* (configuration, packager) { if (configuration.protonNodeVersion != null) { // require("proton-builder/out/ProtonFramework") return (0, _ProtonFramework().createProtonFrameworkSupport)(configuration.protonNodeVersion, packager.appInfo); } else { return yield (0, _ElectronFramework().createElectronFrameworkSupport)(configuration, packager); } }); return function createFrameworkInfo(_x, _x2) { return _ref.apply(this, arguments); }; })(); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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 addHandler(emitter, event, handler) { emitter.on(event, handler); } 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._productionDeps = null; this.stageDirPathCustomizer = (target, packager, arch) => { return path.join(target.outDir, `__${target.name}-${_builderUtil().Arch[arch]}`); }; this._buildResourcesDir = null; this._framework = null; 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: "20.23.1" }, "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; } get productionDeps() { var _this = this; let result = this._productionDeps; if (result == null) { // https://github.com/electron-userland/electron-builder/issues/2551 result = new (_lazyVal().Lazy)((0, _bluebirdLst().coroutine)(function* () { if (_this.config.beforeBuild == null || (yield (0, _fs().exists)(path.join(_this.appDir, "node_modules")))) { return yield (0, _packageDependencies().getProductionDependencies)(_this.appDir); } else { return []; } })); this._productionDeps = 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; } addAfterPackHandler(handler) { this.afterPackHandlers.push(handler); } artifactCreated(handler) { addHandler(this.eventEmitter, "artifactCreated", handler); return this; } dispatchArtifactCreated(event) { this.eventEmitter.emit("artifactCreated", event); } build() { var _this2 = this; return (0, _bluebirdLst().coroutine)(function* () { let configPath = null; let configFromOptions = _this2.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 = _this2.projectDir; const devPackageFile = path.join(projectDir, "package.json"); _this2._devMetadata = yield (0, _promise().orNullIfFileNotExist)((0, _packageMetadata().readPackageJson)(devPackageFile)); const devMetadata = _this2.devMetadata; const configuration = yield (0, _config().getConfig)(projectDir, configPath, configFromOptions, new (_lazyVal().Lazy)(() => Promise.resolve(devMetadata))); if (_builderUtil().log.isDebugEnabled) { _builderUtil().log.debug({ config: getSafeEffectiveConfig(configuration) }, "effective config"); } _this2._appDir = yield (0, _config().computeDefaultAppDirectory)(projectDir, configuration.directories.app); _this2.isTwoPackageJsonProjectLayoutUsed = _this2._appDir !== projectDir; const appPackageFile = _this2.isTwoPackageJsonProjectLayoutUsed ? path.join(_this2.appDir, "package.json") : devPackageFile; // tslint:disable:prefer-conditional-expression if (_this2.devMetadata != null && !_this2.isTwoPackageJsonProjectLayoutUsed) { _this2._metadata = _this2.devMetadata; } else { _this2._metadata = yield _this2.readProjectMetadataIfTwoPackageStructureOrPrepacked(appPackageFile); } (0, _builderUtil().deepAssign)(_this2.metadata, configuration.extraMetadata); if (_this2.isTwoPackageJsonProjectLayoutUsed) { _builderUtil().log.debug({ devPackageFile, appPackageFile }, "two package.json structure is used"); } (0, _packageMetadata().checkMetadata)(_this2.metadata, _this2.devMetadata, appPackageFile, devPackageFile); return yield _this2._build(configuration, _this2._metadata, _this2._devMetadata); })(); } // external caller of this method always uses isTwoPackageJsonProjectLayoutUsed=false and appDir=projectDir, no way (and need) to use another values _build(configuration, metadata, devMetadata, repositoryInfo) { var _this3 = this; return (0, _bluebirdLst().coroutine)(function* () { yield (0, _config().validateConfig)(configuration, _this3.debugLogger); _this3._configuration = configuration; _this3._metadata = metadata; _this3._devMetadata = devMetadata; if (repositoryInfo != null) { _this3._repositoryInfo.value = Promise.resolve(repositoryInfo); } _this3._appInfo = new (_appInfo().AppInfo)(_this3); _this3._framework = yield createFrameworkInfo(_this3.config, _this3); const outDir = path.resolve(_this3.projectDir, (0, _macroExpander().expandMacro)(configuration.directories.output, null, _this3._appInfo)); if (!_isCi().default && process.stdout.isTTY) { const effectiveConfigFile = path.join(outDir, "builder-effective-config.yaml"); _builderUtil().log.info({ file: _builderUtil().log.filePath(effectiveConfigFile) }, "writing effective config"); yield (0, _fsExtraP().outputFile)(effectiveConfigFile, getSafeEffectiveConfig(configuration)); } // because artifact event maybe dispatched several times for different publish providers const artifactPaths = new Set(); _this3.artifactCreated(event => { if (event.file != null) { artifactPaths.add(event.file); } }); const platformToTargets = yield (0, _promise().executeFinally)(_this3.doBuild(outDir), (0, _bluebirdLst().coroutine)(function* () { if (_this3.debugLogger.isEnabled) { yield _this3.debugLogger.save(path.join(outDir, "builder-debug.yml")); } yield _this3.tempDirManager.cleanup(); })); return { outDir, artifactPaths: Array.from(artifactPaths), platformToTargets, configuration }; })(); } readProjectMetadataIfTwoPackageStructureOrPrepacked(appPackageFile) { var _this4 = this; return (0, _bluebirdLst().coroutine)(function* () { let data = yield (0, _promise().orNullIfFileNotExist)((0, _packageMetadata().readPackageJson)(appPackageFile)); if (data != null) { return data; } data = yield (0, _promise().orNullIfFileNotExist)((0, _asar().readAsarJson)(path.join(_this4.projectDir, "app.asar"), "package.json")); if (data != null) { _this4._isPrepackedAppAsar = true; return data; } throw new Error(`Cannot find package.json in the ${path.dirname(appPackageFile)}`); })(); } doBuild(outDir) { var _this5 = this; return (0, _bluebirdLst().coroutine)(function* () { const taskManager = new (_builderUtil().AsyncTaskManager)(_this5.cancellationToken); const platformToTarget = new Map(); const createdOutDirs = new Set(); for (const [platform, archToType] of _this5.options.targets) { if (_this5.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 = _this5.createHelper(platform); const nameToTarget = new Map(); platformToTarget.set(platform, nameToTarget); for (const [arch, targetNames] of (0, _targetFactory().computeArchToTargetNamesMap)(archToType, packager.platformSpecificBuildOptions, platform)) { if (_this5.cancellationToken.cancelled) { break; } yield _this5.installAppDependencies(platform, arch); if (_this5.cancellationToken.cancelled) { break; } const targetList = (0, _targetFactory().createTargets)(nameToTarget, targetNames.length === 0 ? packager.defaultTarget : targetNames, outDir, packager); yield createOutDirIfNeed(targetList, createdOutDirs); yield packager.pack(outDir, arch, targetList, taskManager); } if (_this5.cancellationToken.cancelled) { break; } for (const target of nameToTarget.values()) { taskManager.addTask(target.finishBuild()); } } yield 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}`); } } installAppDependencies(platform, arch) { var _this6 = this; return (0, _bluebirdLst().coroutine)(function* () { if (_this6.options.prepackaged != null || _this6.framework.isNpmRebuildRequired !== true) { return; } const frameworkInfo = { version: _this6.framework.version, useCustomDist: _this6.config.muonVersion == null }; const config = _this6.config; if (config.nodeGypRebuild === true) { _builderUtil().log.info({ arch: _builderUtil().Arch[arch] }, "executing node-gyp rebuild"); yield (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 app dependencies rebuild"); return; } const beforeBuild = (0, _platformPackager().resolveFunction)(config.beforeBuild, "beforeBuild"); if (beforeBuild != null) { const performDependenciesInstallOrRebuild = yield beforeBuild({ appDir: _this6.appDir, electronVersion: _this6.config.electronVersion, platform, arch: _builderUtil().Arch[arch] }); // If beforeBuild resolves to false, it means that handling node_modules is done outside of electron-builder. _this6._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 app dependencies rebuild"); } else { yield (0, _yarn().installOrRebuild)(config, _this6.appDir, { frameworkInfo, platform: platform.nodeName, arch: _builderUtil().Arch[arch], productionDeps: _this6.productionDeps }); } })(); } 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); } return _bluebirdLst().default.each(handlers, it => it(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 _bluebirdLst().default.map(Array.from(ourDirs).sort(), it => { createdOutDirs.add(it); return (0, _fsExtraP().ensureDir)(it); }); } return Promise.resolve(); } function getSafeEffectiveConfig(configuration) { const o = JSON.parse((0, _builderUtil().safeStringifyJson)(configuration)); if (o.cscLink != null) { o.cscLink = "<hidden by builder>"; } return (0, _builderUtil().serializeToYaml)(o, true); } //# sourceMappingURL=packager.js.map