"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.NodePreGyp = void 0; const debug_1 = __importDefault(require("debug")); const cross_spawn_promise_1 = require("@malept/cross-spawn-promise"); const read_binary_file_arch_1 = require("read-binary-file-arch"); const _1 = require("."); const d = (0, debug_1.default)('electron-rebuild'); class NodePreGyp extends _1.NativeModule { async usesTool() { const dependencies = await this.packageJSONFieldWithDefault('dependencies', {}); // eslint-disable-next-line no-prototype-builtins return dependencies.hasOwnProperty('@mapbox/node-pre-gyp'); } async locateBinary() { return (0, _1.locateBinary)(this.modulePath, 'node_modules/@mapbox/node-pre-gyp/bin/node-pre-gyp'); } async run(nodePreGypPath) { const redownloadBinary = await this.shouldUpdateBinary(nodePreGypPath); await (0, cross_spawn_promise_1.spawn)(process.execPath, [ nodePreGypPath, 'reinstall', '--fallback-to-build', ...(redownloadBinary ? ['--update-binary'] : []), `--arch=${this.rebuilder.arch}`, `--target_arch=${this.rebuilder.arch}`, `--target_platform=${this.rebuilder.platform}`, ...await this.getNodePreGypRuntimeArgs(), ], { cwd: this.modulePath, }); } async findPrebuiltModule() { var _a; const nodePreGypPath = await this.locateBinary(); if (nodePreGypPath) { d(`triggering prebuild download step: ${this.moduleName}`); try { await this.run(nodePreGypPath); return true; } catch (err) { d('failed to use node-pre-gyp:', err); if ((_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.includes('requires Node-API but Electron')) { throw err; } } } else { d(`could not find node-pre-gyp relative to: ${this.modulePath}`); } return false; } async getNodePreGypRuntimeArgs() { const moduleNapiVersions = await this.getSupportedNapiVersions(); if (moduleNapiVersions) { return []; } else { return [ '--runtime=electron', `--target=${this.rebuilder.electronVersion}`, `--dist-url=${this.rebuilder.headerURL}`, ]; } } async shouldUpdateBinary(nodePreGypPath) { let shouldUpdate = false; // Redownload binary only if the existing module arch differs from the // target arch. try { const modulePaths = await this.getModulePaths(nodePreGypPath); d('module paths:', modulePaths); for (const modulePath of modulePaths) { let moduleArch; try { moduleArch = await (0, read_binary_file_arch_1.readBinaryFileArch)(modulePath); d('module arch:', moduleArch); } catch (error) { d('failed to read module arch:', error.message); continue; } if (moduleArch && moduleArch !== this.rebuilder.arch) { shouldUpdate = true; d('module architecture differs:', `${moduleArch} !== ${this.rebuilder.arch}`); break; } } } catch (error) { d('failed to get existing binary arch:', error.message); // Assume architecture differs shouldUpdate = true; } return shouldUpdate; } async getModulePaths(nodePreGypPath) { const results = await (0, cross_spawn_promise_1.spawn)(process.execPath, [ nodePreGypPath, 'reveal', 'module', `--target_arch=${this.rebuilder.arch}`, `--target_platform=${this.rebuilder.platform}`, ], { cwd: this.modulePath, }); // Packages with multiple binaries will output one per line return results.split('\n').filter(Boolean); } } exports.NodePreGyp = NodePreGyp; //# sourceMappingURL=node-pre-gyp.js.map