This commit is contained in:
2026-03-25 14:14:07 +01:00
parent d6b31e2ef7
commit a0073b4fb1
10368 changed files with 2214340 additions and 0 deletions

View File

@@ -0,0 +1,16 @@
/**
* Runs the `uname` command and returns the trimmed output.
*
* Copied from `@electron/get`.
*/
export declare function uname(): string;
export declare type ConfigVariables = {
arm_version?: string;
};
/**
* Generates an architecture name that would be used in an Electron or Node.js
* download file name.
*
* Copied from `@electron/get`.
*/
export declare function getNodeArch(arch: string, configVariables: ConfigVariables): string;

View File

@@ -0,0 +1,36 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getNodeArch = exports.uname = void 0;
const child_process_1 = require("child_process");
/**
* Runs the `uname` command and returns the trimmed output.
*
* Copied from `@electron/get`.
*/
function uname() {
return (0, child_process_1.execSync)('uname -m')
.toString()
.trim();
}
exports.uname = uname;
/**
* Generates an architecture name that would be used in an Electron or Node.js
* download file name.
*
* Copied from `@electron/get`.
*/
function getNodeArch(arch, configVariables) {
if (arch === 'arm') {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
switch (configVariables.arm_version) {
case '6':
return uname();
case '7':
default:
return 'armv7l';
}
}
return arch;
}
exports.getNodeArch = getNodeArch;
//# sourceMappingURL=arch.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"arch.js","sourceRoot":"","sources":["../../src/arch.ts"],"names":[],"mappings":";;;AAAA,iDAAyC;AAEzC;;;;GAIG;AACH,SAAgB,KAAK;IACnB,OAAO,IAAA,wBAAQ,EAAC,UAAU,CAAC;SACxB,QAAQ,EAAE;SACV,IAAI,EAAE,CAAC;AACZ,CAAC;AAJD,sBAIC;AAMD;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,IAAY,EAAE,eAAgC;IACxE,IAAI,IAAI,KAAK,KAAK,EAAE;QAClB,8DAA8D;QAC9D,QAAQ,eAAe,CAAC,WAAW,EAAE;YACnC,KAAK,GAAG;gBACN,OAAO,KAAK,EAAE,CAAC;YACjB,KAAK,GAAG,CAAC;YACT;gBACE,OAAO,QAAQ,CAAC;SACnB;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAbD,kCAaC"}

View File

@@ -0,0 +1,13 @@
declare type CacheOptions = {
ABI: string;
arch: string;
debug: boolean;
electronVersion: string;
headerURL: string;
modulePath: string;
};
export declare const cacheModuleState: (dir: string, cachePath: string, key: string) => Promise<void>;
declare type ApplyDiffFunction = (dir: string) => Promise<void>;
export declare const lookupModuleState: (cachePath: string, key: string) => Promise<ApplyDiffFunction | boolean>;
export declare function generateCacheKey(opts: CacheOptions): Promise<string>;
export {};

View File

@@ -0,0 +1,153 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateCacheKey = exports.lookupModuleState = exports.cacheModuleState = void 0;
const crypto_1 = __importDefault(require("crypto"));
const debug_1 = __importDefault(require("debug"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const path_1 = __importDefault(require("path"));
const zlib_1 = __importDefault(require("zlib"));
const d = (0, debug_1.default)('electron-rebuild');
// Update this number if you change the caching logic to ensure no bad cache hits
const ELECTRON_REBUILD_CACHE_ID = 1;
class Snap {
constructor(hash, data) {
this.hash = hash;
this.data = data;
}
}
const takeSnapshot = async (dir, relativeTo = dir) => {
const snap = {};
await Promise.all((await fs_extra_1.default.readdir(dir)).map(async (child) => {
if (child === 'node_modules')
return;
const childPath = path_1.default.resolve(dir, child);
const relative = path_1.default.relative(relativeTo, childPath);
if ((await fs_extra_1.default.stat(childPath)).isDirectory()) {
snap[relative] = await takeSnapshot(childPath, relativeTo);
}
else {
const data = await fs_extra_1.default.readFile(childPath);
snap[relative] = new Snap(crypto_1.default.createHash('SHA256').update(data).digest('hex'), data);
}
}));
return snap;
};
const writeSnapshot = async (diff, dir) => {
for (const key in diff) {
if (diff[key] instanceof Snap) {
await fs_extra_1.default.mkdirp(path_1.default.dirname(path_1.default.resolve(dir, key)));
await fs_extra_1.default.writeFile(path_1.default.resolve(dir, key), diff[key].data);
}
else {
await fs_extra_1.default.mkdirp(path_1.default.resolve(dir, key));
await writeSnapshot(diff[key], dir);
}
}
};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const serialize = (snap) => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const jsonReady = {};
for (const key in snap) {
if (snap[key] instanceof Snap) {
const s = snap[key];
jsonReady[key] = {
__isSnap: true,
hash: s.hash,
data: s.data.toString('base64')
};
}
else {
jsonReady[key] = serialize(snap[key]);
}
}
return jsonReady;
};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const unserialize = (jsonReady) => {
const snap = {};
for (const key in jsonReady) {
if (jsonReady[key].__isSnap) {
snap[key] = new Snap(jsonReady[key].hash, Buffer.from(jsonReady[key].data, 'base64'));
}
else {
snap[key] = unserialize(jsonReady[key]);
}
}
return snap;
};
const cacheModuleState = async (dir, cachePath, key) => {
const snap = await takeSnapshot(dir);
const moduleBuffer = Buffer.from(JSON.stringify(serialize(snap)));
const zipped = await new Promise(resolve => zlib_1.default.gzip(moduleBuffer, (_, result) => resolve(result)));
await fs_extra_1.default.mkdirp(cachePath);
await fs_extra_1.default.writeFile(path_1.default.resolve(cachePath, key), zipped);
};
exports.cacheModuleState = cacheModuleState;
const lookupModuleState = async (cachePath, key) => {
if (await fs_extra_1.default.pathExists(path_1.default.resolve(cachePath, key))) {
return async function applyDiff(dir) {
const zipped = await fs_extra_1.default.readFile(path_1.default.resolve(cachePath, key));
const unzipped = await new Promise(resolve => { zlib_1.default.gunzip(zipped, (_, result) => resolve(result)); });
const diff = unserialize(JSON.parse(unzipped.toString()));
await writeSnapshot(diff, dir);
};
}
return false;
};
exports.lookupModuleState = lookupModuleState;
function dHashTree(tree, hash) {
for (const key of Object.keys(tree).sort()) {
hash.update(key);
if (typeof tree[key] === 'string') {
hash.update(tree[key]);
}
else {
dHashTree(tree[key], hash);
}
}
}
async function hashDirectory(dir, relativeTo) {
relativeTo !== null && relativeTo !== void 0 ? relativeTo : (relativeTo = dir);
d('hashing dir', dir);
const dirTree = {};
await Promise.all((await fs_extra_1.default.readdir(dir)).map(async (child) => {
d('found child', child, 'in dir', dir);
// Ignore output directories
if (dir === relativeTo && (child === 'build' || child === 'bin'))
return;
// Don't hash nested node_modules
if (child === 'node_modules')
return;
const childPath = path_1.default.resolve(dir, child);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const relative = path_1.default.relative(relativeTo, childPath);
if ((await fs_extra_1.default.stat(childPath)).isDirectory()) {
dirTree[relative] = await hashDirectory(childPath, relativeTo);
}
else {
dirTree[relative] = crypto_1.default.createHash('SHA256').update(await fs_extra_1.default.readFile(childPath)).digest('hex');
}
}));
return dirTree;
}
async function generateCacheKey(opts) {
const tree = await hashDirectory(opts.modulePath);
const hasher = crypto_1.default.createHash('SHA256')
.update(`${ELECTRON_REBUILD_CACHE_ID}`)
.update(path_1.default.basename(opts.modulePath))
.update(opts.ABI)
.update(opts.arch)
.update(opts.debug ? 'debug' : 'not debug')
.update(opts.headerURL)
.update(opts.electronVersion);
dHashTree(tree, hasher);
const hash = hasher.digest('hex');
d('calculated hash of', opts.modulePath, 'to be', hash);
return hash;
}
exports.generateCacheKey = generateCacheKey;
//# sourceMappingURL=cache.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,4 @@
export declare function getClangEnvironmentVars(electronVersion: string, targetArch: string): Promise<{
env: Record<string, string>;
args: string[];
}>;

View File

@@ -0,0 +1,145 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getClangEnvironmentVars = void 0;
const cp = __importStar(require("child_process"));
const debug_1 = __importDefault(require("debug"));
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
const semver_1 = __importDefault(require("semver"));
const tar = __importStar(require("tar"));
const zlib = __importStar(require("zlib"));
const constants_1 = require("./constants");
const fetcher_1 = require("./fetcher");
const sysroot_fetcher_1 = require("./sysroot-fetcher");
const d = (0, debug_1.default)('electron-rebuild');
const CDS_URL = 'https://commondatastorage.googleapis.com/chromium-browser-clang';
function getPlatformUrlPrefix(hostOS) {
const prefixMap = {
'linux': 'Linux_x64',
'darwin': 'Mac',
'win32': 'Win',
};
return CDS_URL + '/' + prefixMap[hostOS] + '/';
}
function getClangDownloadURL(packageFile, packageVersion, hostOS) {
const cdsFile = `${packageFile}-${packageVersion}.tgz`;
return getPlatformUrlPrefix(hostOS) + cdsFile;
}
function getSDKRoot() {
if (process.env.SDKROOT)
return process.env.SDKROOT;
const output = cp.execFileSync('xcrun', ['--sdk', 'macosx', '--show-sdk-path']);
return output.toString().trim();
}
async function getClangEnvironmentVars(electronVersion, targetArch) {
const clangDownloadDir = await downloadClangVersion(electronVersion);
const clangDir = path.resolve(clangDownloadDir, 'bin');
const cxxflags = [];
const clangArgs = [];
if (process.platform === 'darwin') {
clangArgs.push('-isysroot', getSDKRoot());
}
if (semver_1.default.major(electronVersion) >= 20) {
cxxflags.push('-std=c++17');
}
const gypArgs = [];
if (process.platform === 'win32') {
console.log(fs.readdirSync(clangDir));
gypArgs.push(`/p:CLToolExe=clang-cl.exe`, `/p:CLToolPath=${clangDir}`);
}
if (process.platform === 'linux') {
const sysrootPath = await (0, sysroot_fetcher_1.downloadLinuxSysroot)(electronVersion, targetArch);
clangArgs.push('--sysroot', sysrootPath);
}
return {
env: {
CC: `"${path.resolve(clangDir, 'clang')}" ${clangArgs.join(' ')}`,
CXX: `"${path.resolve(clangDir, 'clang++')}" ${clangArgs.join(' ')}`,
CFLAGS: `${cxxflags.join(' ')}`,
CXXFLAGS: `${cxxflags.join(' ')}`
},
args: gypArgs,
};
}
exports.getClangEnvironmentVars = getClangEnvironmentVars;
function clangVersionFromRevision(update) {
const regex = /CLANG_REVISION = '([^']+)'\nCLANG_SUB_REVISION = (\d+)\n/g;
const clangVersionMatch = regex.exec(update);
if (!clangVersionMatch)
return null;
const [, clangVersion, clangSubRevision] = clangVersionMatch;
return `${clangVersion}-${clangSubRevision}`;
}
function clangVersionFromSVN(update) {
const regex = /CLANG_REVISION = '([^']+)'\nCLANG_SVN_REVISION = '([^']+)'\nCLANG_SUB_REVISION = (\d+)\n/g;
const clangVersionMatch = regex.exec(update);
if (!clangVersionMatch)
return null;
const [, clangVersion, clangSvn, clangSubRevision] = clangVersionMatch;
return `${clangSvn}-${clangVersion.substr(0, 8)}-${clangSubRevision}`;
}
async function downloadClangVersion(electronVersion) {
d('fetching clang for Electron:', electronVersion);
const clangDirPath = path.resolve(constants_1.ELECTRON_GYP_DIR, `${electronVersion}-clang`);
if (await fs.pathExists(path.resolve(clangDirPath, 'bin', 'clang')))
return clangDirPath;
if (!await fs.pathExists(constants_1.ELECTRON_GYP_DIR))
await fs.mkdirp(constants_1.ELECTRON_GYP_DIR);
const electronDeps = await (0, fetcher_1.fetch)(`https://raw.githubusercontent.com/electron/electron/v${electronVersion}/DEPS`, 'text');
const chromiumRevisionExtractor = /'chromium_version':\n\s+'([^']+)/g;
const chromiumRevisionMatch = chromiumRevisionExtractor.exec(electronDeps);
if (!chromiumRevisionMatch)
throw new Error('Failed to determine Chromium revision for given Electron version');
const chromiumRevision = chromiumRevisionMatch[1];
d('fetching clang for Chromium:', chromiumRevision);
const base64ClangUpdate = await (0, fetcher_1.fetch)(`https://chromium.googlesource.com/chromium/src.git/+/${chromiumRevision}/tools/clang/scripts/update.py?format=TEXT`, 'text');
const clangUpdate = Buffer.from(base64ClangUpdate, 'base64').toString('utf8');
const clangVersionString = clangVersionFromRevision(clangUpdate) || clangVersionFromSVN(clangUpdate);
if (!clangVersionString)
throw new Error('Failed to determine Clang revision from Electron version');
d('fetching clang:', clangVersionString);
const clangDownloadURL = getClangDownloadURL('clang', clangVersionString, process.platform);
const contents = await (0, fetcher_1.fetch)(clangDownloadURL, 'buffer');
d('deflating clang');
zlib.deflateSync(contents);
const tarPath = path.resolve(constants_1.ELECTRON_GYP_DIR, `${electronVersion}-clang.tar`);
if (await fs.pathExists(tarPath))
await fs.remove(tarPath);
await fs.writeFile(tarPath, Buffer.from(contents));
await fs.mkdirp(clangDirPath);
d('tar running on clang');
await tar.x({
file: tarPath,
cwd: clangDirPath,
});
await fs.remove(tarPath);
d('cleaning up clang tar file');
return clangDirPath;
}
//# sourceMappingURL=clang-fetcher.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"clang-fetcher.js","sourceRoot":"","sources":["../../src/clang-fetcher.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,2 @@
#!/usr/bin/env node
export {};

View File

@@ -0,0 +1,168 @@
#!/usr/bin/env node
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const chalk_1 = __importDefault(require("chalk"));
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
const ora = require("ora");
const yargs_1 = __importDefault(require("yargs/yargs"));
const search_module_1 = require("./search-module");
const electron_locator_1 = require("./electron-locator");
const rebuild_1 = require("./rebuild");
const argv = (0, yargs_1.default)(process.argv.slice(2)).version(false).options({
version: { alias: 'v', type: 'string', description: 'The version of Electron to build against' },
force: { alias: 'f', type: 'boolean', description: 'Force rebuilding modules, even if we would skip it otherwise' },
arch: { alias: 'a', type: 'string', description: "Override the target architecture to something other than your system's" },
'module-dir': { alias: 'm', type: 'string', description: 'The path to the node_modules directory to rebuild' },
// TODO: should be type: array
'which-module': { alias: 'w', type: 'string', description: 'A specific module to build, or comma separated list of modules. Modules will only be rebuilt if they also match the types of dependencies being rebuilt (see --types).' },
// TODO: should be type: array
only: { alias: 'o', type: 'string', description: 'Only build specified module, or comma separated list of modules. All others are ignored.' },
'electron-prebuilt-dir': { alias: 'e', type: 'string', description: 'The path to the prebuilt electron module' },
'dist-url': { alias: 'd', type: 'string', description: 'Custom header tarball URL' },
// TODO: should be type: array
types: { alias: 't', type: 'string', description: 'The types of dependencies to rebuild. Comma separated list of "prod", "dev" and "optional". Default is "prod,optional"' },
parallel: { alias: 'p', type: 'boolean', description: 'Rebuild in parallel, this is enabled by default on macOS and Linux' },
sequential: { alias: 's', type: 'boolean', description: 'Rebuild modules sequentially, this is enabled by default on Windows' },
debug: { alias: 'b', type: 'boolean', description: 'Build debug version of modules' },
'prebuild-tag-prefix': { type: 'string', description: 'GitHub tag prefix passed to prebuild-install. Default is "v"' },
'force-abi': { type: 'number', description: 'Override the ABI version for the version of Electron you are targeting. Only use when targeting Nightly releases.' },
'use-electron-clang': { type: 'boolean', description: 'Use the clang executable that Electron used when building its binary. This will guarantee compiler compatibility' },
'disable-pre-gyp-copy': { type: 'boolean', description: 'Disables the pre-gyp copy step' },
}).usage('Usage: $0 --version [version] --module-dir [path]')
.help()
.alias('help', 'h')
.epilog('Copyright 2016-2021')
.parseSync();
if (process.argv.length === 3 && process.argv[2] === '--version') {
/* eslint-disable @typescript-eslint/no-var-requires */
try {
console.log('Electron Rebuild Version:', require(path.resolve(__dirname, '../../package.json')).version);
}
catch (err) {
console.log('Electron Rebuild Version:', require(path.resolve(__dirname, '../package.json')).version);
}
/* eslint-enable @typescript-eslint/no-var-requires */
process.exit(0);
}
const handler = (err) => {
console.error(chalk_1.default.red('\nAn unhandled error occurred inside electron-rebuild'));
console.error(chalk_1.default.red(`${err.message}\n\n${err.stack}`));
process.exit(-1);
};
process.on('uncaughtException', handler);
process.on('unhandledRejection', handler);
(async () => {
const projectRootPath = await (0, search_module_1.getProjectRootPath)(process.cwd());
const electronModulePath = argv.e ? path.resolve(process.cwd(), argv.e) : await (0, electron_locator_1.locateElectronModule)(projectRootPath);
let electronModuleVersion = argv.v;
if (!electronModuleVersion) {
try {
if (!electronModulePath)
throw new Error('Prebuilt electron module not found');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const pkgJson = require(path.join(electronModulePath, 'package.json'));
electronModuleVersion = pkgJson.version;
}
catch (e) {
throw new Error(`Unable to find electron's version number, either install it or specify an explicit version`);
}
}
let rootDirectory = argv.m;
if (!rootDirectory) {
// NB: We assume here that we're going to rebuild the immediate parent's
// node modules, which might not always be the case but it's at least a
// good guess
rootDirectory = path.resolve(__dirname, '../../..');
if (!await fs.pathExists(rootDirectory) || !await fs.pathExists(path.resolve(rootDirectory, 'package.json'))) {
// Then we try the CWD
rootDirectory = process.cwd();
if (!await fs.pathExists(rootDirectory) || !await fs.pathExists(path.resolve(rootDirectory, 'package.json'))) {
throw new Error('Unable to find parent node_modules directory, specify it via --module-dir, E.g. "--module-dir ." for the current directory');
}
}
}
else {
rootDirectory = path.resolve(process.cwd(), rootDirectory);
}
if (argv.forceAbi && typeof argv.forceAbi !== 'number') {
throw new Error('force-abi must be a number');
}
let modulesDone = 0;
let moduleTotal = 0;
const rebuildSpinner = ora('Searching dependency tree').start();
let lastModuleName;
const redraw = (moduleName) => {
if (moduleName)
lastModuleName = moduleName;
if (argv.p) {
rebuildSpinner.text = `Building modules: ${modulesDone}/${moduleTotal}`;
}
else {
rebuildSpinner.text = `Building module: ${lastModuleName}, Completed: ${modulesDone}`;
}
};
const rebuilder = (0, rebuild_1.rebuild)({
buildPath: rootDirectory,
electronVersion: electronModuleVersion,
arch: argv.a || process.arch,
extraModules: argv.w ? argv.w.split(',') : [],
onlyModules: argv.o ? argv.o.split(',') : null,
force: argv.f,
headerURL: argv.d,
types: argv.t ? argv.t.split(',') : ['prod', 'optional'],
mode: argv.p ? 'parallel' : (argv.s ? 'sequential' : undefined),
debug: argv.debug,
prebuildTagPrefix: argv.prebuildTagPrefix || 'v',
forceABI: argv.forceAbi,
useElectronClang: !!argv.useElectronClang,
disablePreGypCopy: !!argv.disablePreGypCopy,
projectRootPath,
});
const lifecycle = rebuilder.lifecycle;
lifecycle.on('module-found', (moduleName) => {
moduleTotal += 1;
redraw(moduleName);
});
lifecycle.on('module-done', () => {
modulesDone += 1;
redraw();
});
try {
await rebuilder;
}
catch (err) {
rebuildSpinner.text = 'Rebuild Failed';
rebuildSpinner.fail();
throw err;
}
rebuildSpinner.text = 'Rebuild Complete';
rebuildSpinner.succeed();
})();
//# sourceMappingURL=cli.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
export declare const ELECTRON_GYP_DIR: string;

View File

@@ -0,0 +1,30 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ELECTRON_GYP_DIR = void 0;
const os = __importStar(require("os"));
const path = __importStar(require("path"));
exports.ELECTRON_GYP_DIR = path.resolve(os.homedir(), '.electron-gyp');
//# sourceMappingURL=constants.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAEhB,QAAA,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC"}

View File

@@ -0,0 +1 @@
export declare function locateElectronModule(projectRootPath?: string | undefined, startDir?: string | undefined): Promise<string | null>;

View File

@@ -0,0 +1,56 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.locateElectronModule = void 0;
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
const search_module_1 = require("./search-module");
const electronModuleNames = ['electron', 'electron-prebuilt-compile'];
async function locateModuleByRequire() {
for (const moduleName of electronModuleNames) {
try {
const modulePath = path.resolve(require.resolve(path.join(moduleName, 'package.json')), '..');
if (await fs.pathExists(path.join(modulePath, 'package.json'))) {
return modulePath;
}
}
catch { // eslint-disable-line no-empty
}
}
return null;
}
async function locateElectronModule(projectRootPath = undefined, startDir = undefined) {
startDir !== null && startDir !== void 0 ? startDir : (startDir = process.cwd());
for (const moduleName of electronModuleNames) {
const electronPaths = await (0, search_module_1.searchForModule)(startDir, moduleName, projectRootPath);
const electronPath = electronPaths.find(async (ePath) => await fs.pathExists(path.join(ePath, 'package.json')));
if (electronPath) {
return electronPath;
}
}
return locateModuleByRequire();
}
exports.locateElectronModule = locateElectronModule;
//# sourceMappingURL=electron-locator.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"electron-locator.js","sourceRoot":"","sources":["../../src/electron-locator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAC/B,2CAA6B;AAC7B,mDAAkD;AAElD,MAAM,mBAAmB,GAAG,CAAC,UAAU,EAAG,2BAA2B,CAAC,CAAC;AAEvE,KAAK,UAAU,qBAAqB;IAClC,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE;QAC5C,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC9F,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,EAAE;gBAC9D,OAAO,UAAU,CAAC;aACnB;SACF;QAAC,MAAM,EAAE,+BAA+B;SACxC;KACF;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAEM,KAAK,UAAU,oBAAoB,CACxC,kBAAsC,SAAS,EAC/C,WAA+B,SAAS;IAExC,QAAQ,aAAR,QAAQ,cAAR,QAAQ,IAAR,QAAQ,GAAK,OAAO,CAAC,GAAG,EAAE,EAAC;IAE3B,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE;QAC5C,MAAM,aAAa,GAAG,MAAM,IAAA,+BAAe,EAAC,QAAQ,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QACnF,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;QAExH,IAAI,YAAY,EAAE;YAChB,OAAO,YAAY,CAAC;SACrB;KACF;IAED,OAAO,qBAAqB,EAAE,CAAC;AACjC,CAAC;AAhBD,oDAgBC"}

View File

@@ -0,0 +1,2 @@
/// <reference types="node" />
export declare function fetch<T extends 'buffer' | 'text', RT = T extends 'buffer' ? Buffer : string>(url: string, responseType: T, retries?: number): Promise<RT>;

View File

@@ -0,0 +1,36 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fetch = void 0;
const debug_1 = __importDefault(require("debug"));
const got_1 = __importDefault(require("got"));
const d = (0, debug_1.default)('electron-rebuild');
function sleep(n) {
return new Promise(r => setTimeout(r, n));
}
async function fetch(url, responseType, retries = 3) {
if (retries === 0)
throw new Error('Failed to fetch a clang resource, run with DEBUG=electron-rebuild for more information');
d('downloading:', url);
try {
const response = await got_1.default.get(url, {
responseType,
});
if (response.statusCode !== 200) {
d('got bad status code:', response.statusCode);
await sleep(2000);
return fetch(url, responseType, retries - 1);
}
d('response came back OK');
return response.body;
}
catch (err) {
d('request failed for some reason', err);
await sleep(2000);
return fetch(url, responseType, retries - 1);
}
}
exports.fetch = fetch;
//# sourceMappingURL=fetcher.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../src/fetcher.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,8CAAsB;AAEtB,MAAM,CAAC,GAAG,IAAA,eAAK,EAAC,kBAAkB,CAAC,CAAC;AAEpC,SAAS,KAAK,CAAC,CAAS;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAEM,KAAK,UAAU,KAAK,CAAyE,GAAW,EAAE,YAAe,EAAE,OAAO,GAAG,CAAC;IAC3I,IAAI,OAAO,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;IAC7H,CAAC,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACvB,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,aAAG,CAAC,GAAG,CAAC,GAAG,EAAE;YAClC,YAAY;SACb,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE;YAC/B,CAAC,CAAC,sBAAsB,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;SAC9C;QACD,CAAC,CAAC,uBAAuB,CAAC,CAAC;QAC3B,OAAO,QAAQ,CAAC,IAAU,CAAC;KAC5B;IAAC,OAAO,GAAG,EAAE;QACZ,CAAC,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;KAC9C;AACH,CAAC;AAnBD,sBAmBC"}

View File

@@ -0,0 +1,3 @@
import { rebuild, RebuildOptions } from './rebuild';
export { rebuild, RebuildOptions };
export default rebuild;

View File

@@ -0,0 +1,10 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.rebuild = void 0;
const rebuild_1 = require("./rebuild");
Object.defineProperty(exports, "rebuild", { enumerable: true, get: function () { return rebuild_1.rebuild; } });
exports.default = rebuild_1.rebuild;
Object.defineProperty(exports, '__esModule', {
value: true
});
//# sourceMappingURL=main.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";;;AAAA,uCAAoD;AAE3C,wFAFA,iBAAO,OAEA;AAChB,kBAAe,iBAAO,CAAC;AACvB,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE;IAC3C,KAAK,EAAE,IAAI;CACZ,CAAC,CAAC"}

View File

@@ -0,0 +1,27 @@
import { IRebuilder } from './types';
export declare class ModuleRebuilder {
private modulePath;
private nodeGyp;
private rebuilder;
private prebuildify;
private prebuildInstall;
constructor(rebuilder: IRebuilder, modulePath: string);
get metaPath(): string;
get metaData(): string;
alreadyBuiltByRebuild(): Promise<boolean>;
cacheModuleState(cacheKey: string): Promise<void>;
/**
* Whether a prebuild-install-generated native module exists.
*/
prebuildInstallNativeModuleExists(): Promise<boolean>;
/**
* If the native module uses prebuildify, check to see if it comes with a prebuilt module for
* the given platform and arch.
*/
findPrebuildifyModule(cacheKey: string): Promise<boolean>;
findPrebuildInstallModule(cacheKey: string): Promise<boolean>;
rebuildNodeGypModule(cacheKey: string): Promise<boolean>;
replaceExistingNativeModule(): Promise<void>;
writeMetadata(): Promise<void>;
rebuild(cacheKey: string): Promise<boolean>;
}

View File

@@ -0,0 +1,132 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ModuleRebuilder = void 0;
const debug_1 = __importDefault(require("debug"));
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
const cache_1 = require("./cache");
const node_gyp_1 = require("./module-type/node-gyp");
const prebuildify_1 = require("./module-type/prebuildify");
const prebuild_install_1 = require("./module-type/prebuild-install");
const d = (0, debug_1.default)('electron-rebuild');
class ModuleRebuilder {
constructor(rebuilder, modulePath) {
this.modulePath = modulePath;
this.rebuilder = rebuilder;
this.nodeGyp = new node_gyp_1.NodeGyp(rebuilder, modulePath);
this.prebuildify = new prebuildify_1.Prebuildify(rebuilder, modulePath);
this.prebuildInstall = new prebuild_install_1.PrebuildInstall(rebuilder, modulePath);
}
get metaPath() {
return path.resolve(this.modulePath, 'build', this.rebuilder.buildType, '.forge-meta');
}
get metaData() {
return `${this.rebuilder.arch}--${this.rebuilder.ABI}`;
}
async alreadyBuiltByRebuild() {
if (await fs.pathExists(this.metaPath)) {
const meta = await fs.readFile(this.metaPath, 'utf8');
return meta === this.metaData;
}
return false;
}
async cacheModuleState(cacheKey) {
if (this.rebuilder.useCache) {
await (0, cache_1.cacheModuleState)(this.modulePath, this.rebuilder.cachePath, cacheKey);
}
}
/**
* Whether a prebuild-install-generated native module exists.
*/
async prebuildInstallNativeModuleExists() {
return this.prebuildInstall.prebuiltModuleExists();
}
/**
* If the native module uses prebuildify, check to see if it comes with a prebuilt module for
* the given platform and arch.
*/
async findPrebuildifyModule(cacheKey) {
if (await this.prebuildify.usesTool()) {
d(`assuming is prebuildify powered: ${this.prebuildify.moduleName}`);
if (await this.prebuildify.findPrebuiltModule()) {
await this.writeMetadata();
await this.cacheModuleState(cacheKey);
return true;
}
}
return false;
}
async findPrebuildInstallModule(cacheKey) {
if (await this.prebuildInstall.usesTool()) {
d(`assuming is prebuild-install powered: ${this.prebuildInstall.moduleName}`);
if (await this.prebuildInstall.findPrebuiltModule()) {
d('installed prebuilt module:', this.prebuildInstall.moduleName);
await this.writeMetadata();
await this.cacheModuleState(cacheKey);
return true;
}
}
return false;
}
async rebuildNodeGypModule(cacheKey) {
await this.nodeGyp.rebuildModule();
d('built via node-gyp:', this.nodeGyp.moduleName);
await this.writeMetadata();
await this.replaceExistingNativeModule();
await this.cacheModuleState(cacheKey);
return true;
}
async replaceExistingNativeModule() {
const buildLocation = path.resolve(this.modulePath, 'build', this.rebuilder.buildType);
d('searching for .node file', buildLocation);
const buildLocationFiles = await fs.readdir(buildLocation);
d('testing files', buildLocationFiles);
const nodeFile = buildLocationFiles.find((file) => file !== '.node' && file.endsWith('.node'));
const nodePath = nodeFile ? path.resolve(buildLocation, nodeFile) : undefined;
if (nodePath && await fs.pathExists(nodePath)) {
d('found .node file', nodePath);
if (!this.rebuilder.disablePreGypCopy) {
const abiPath = path.resolve(this.modulePath, `bin/${this.rebuilder.platform}-${this.rebuilder.arch}-${this.rebuilder.ABI}`);
d('copying to prebuilt place:', abiPath);
await fs.mkdir(abiPath, { recursive: true });
await fs.copyFile(nodePath, path.join(abiPath, `${this.nodeGyp.moduleName}.node`));
}
}
}
async writeMetadata() {
await fs.outputFile(this.metaPath, this.metaData);
}
async rebuild(cacheKey) {
return (await this.findPrebuildifyModule(cacheKey)) ||
(await this.findPrebuildInstallModule(cacheKey)) ||
(await this.rebuildNodeGypModule(cacheKey));
}
}
exports.ModuleRebuilder = ModuleRebuilder;
//# sourceMappingURL=module-rebuilder.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"module-rebuilder.js","sourceRoot":"","sources":["../../src/module-rebuilder.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,17 @@
import { NodeAPI } from '../node-api';
import { IRebuilder } from '../types';
declare type PackageJSONValue = string | Record<string, unknown>;
export declare class NativeModule {
protected rebuilder: IRebuilder;
private _moduleName;
protected modulePath: string;
nodeAPI: NodeAPI;
private packageJSON;
constructor(rebuilder: IRebuilder, modulePath: string);
get moduleName(): string;
packageJSONFieldWithDefault(key: string, defaultValue: PackageJSONValue): Promise<PackageJSONValue>;
packageJSONField(key: string): Promise<PackageJSONValue | undefined>;
getSupportedNapiVersions(): Promise<number[] | undefined>;
}
export declare function locateBinary(basePath: string, suffix: string): Promise<string | null>;
export {};

View File

@@ -0,0 +1,56 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.locateBinary = exports.NativeModule = void 0;
const fs_extra_1 = __importDefault(require("fs-extra"));
const path_1 = __importDefault(require("path"));
const node_api_1 = require("../node-api");
const read_package_json_1 = require("../read-package-json");
class NativeModule {
constructor(rebuilder, modulePath) {
this.rebuilder = rebuilder;
this.modulePath = modulePath;
this.nodeAPI = new node_api_1.NodeAPI(this.moduleName, this.rebuilder.electronVersion);
}
get moduleName() {
if (!this._moduleName) {
const basename = path_1.default.basename(this.modulePath);
const parentDir = path_1.default.basename(path_1.default.dirname(this.modulePath));
if (parentDir.startsWith('@')) {
this._moduleName = `${parentDir}/${basename}`;
}
this._moduleName = basename;
}
return this._moduleName;
}
async packageJSONFieldWithDefault(key, defaultValue) {
const result = await this.packageJSONField(key);
return result === undefined ? defaultValue : result;
}
async packageJSONField(key) {
this.packageJSON || (this.packageJSON = await (0, read_package_json_1.readPackageJson)(this.modulePath));
return this.packageJSON[key];
}
async getSupportedNapiVersions() {
const binary = (await this.packageJSONFieldWithDefault('binary', {}));
return binary === null || binary === void 0 ? void 0 : binary.napi_versions;
}
}
exports.NativeModule = NativeModule;
async function locateBinary(basePath, suffix) {
let parentPath = basePath;
let testPath;
while (testPath !== parentPath) {
testPath = parentPath;
const checkPath = path_1.default.resolve(testPath, suffix);
if (await fs_extra_1.default.pathExists(checkPath)) {
return checkPath;
}
parentPath = path_1.default.resolve(testPath, '..');
}
return null;
}
exports.locateBinary = locateBinary;
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/module-type/index.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA0B;AAC1B,gDAAwB;AAExB,0CAAsC;AACtC,4DAAuD;AAKvD,MAAa,YAAY;IAOvB,YAAY,SAAqB,EAAE,UAAkB;QACnD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,SAAS,GAAG,cAAI,CAAC,QAAQ,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAC/D,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBAC7B,IAAI,CAAC,WAAW,GAAG,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAC;aAC/C;YAED,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;SAC7B;QAED,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,2BAA2B,CAAC,GAAW,EAAE,YAA8B;QAC3E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAChD,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAAW;QAChC,IAAI,CAAC,WAAW,KAAhB,IAAI,CAAC,WAAW,GAAK,MAAM,IAAA,mCAAe,EAAC,IAAI,CAAC,UAAU,CAAC,EAAC;QAE5D,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,wBAAwB;QAC5B,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,2BAA2B,CACpD,QAAQ,EACR,EAAE,CACH,CAA6B,CAAC;QAE/B,OAAO,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,CAAC;IAC/B,CAAC;CACF;AA9CD,oCA8CC;AAEM,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,MAAc;IACjE,IAAI,UAAU,GAAG,QAAQ,CAAC;IAC1B,IAAI,QAA4B,CAAC;IAEjC,OAAO,QAAQ,KAAK,UAAU,EAAE;QAC9B,QAAQ,GAAG,UAAU,CAAC;QACtB,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAClC,OAAO,SAAS,CAAC;SAClB;QACD,UAAU,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;KAC3C;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAdD,oCAcC"}

View File

@@ -0,0 +1,7 @@
import { NativeModule } from '.';
export declare class NodeGyp extends NativeModule {
buildArgs(prefixedArgs: string[]): Promise<string[]>;
buildArgsFromBinaryField(): Promise<string[]>;
rebuildModule(): Promise<void>;
private restoreEnv;
}

View File

@@ -0,0 +1,149 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.NodeGyp = void 0;
const debug_1 = __importDefault(require("debug"));
const detect_libc_1 = __importDefault(require("detect-libc"));
const node_gyp_1 = __importDefault(require("node-gyp"));
const path_1 = __importDefault(require("path"));
const util_1 = require("util");
const semver_1 = __importDefault(require("semver"));
const constants_1 = require("../constants");
const clang_fetcher_1 = require("../clang-fetcher");
const _1 = require(".");
const d = (0, debug_1.default)('electron-rebuild');
class NodeGyp extends _1.NativeModule {
async buildArgs(prefixedArgs) {
const args = [
'node',
'node-gyp',
'rebuild',
...prefixedArgs,
`--runtime=electron`,
`--target=${this.rebuilder.electronVersion}`,
`--arch=${this.rebuilder.arch}`,
`--dist-url=${this.rebuilder.headerURL}`,
'--build-from-source'
];
args.push(d.enabled ? '--verbose' : '--silent');
if (this.rebuilder.debug) {
args.push('--debug');
}
args.push(...(await this.buildArgsFromBinaryField()));
if (this.rebuilder.msvsVersion) {
args.push(`--msvs_version=${this.rebuilder.msvsVersion}`);
}
// Headers of old Electron versions do not have a valid config.gypi file
// and --force-process-config must be passed to node-gyp >= 8.4.0 to
// correctly build modules for them.
// See also https://github.com/nodejs/node-gyp/pull/2497
if (!semver_1.default.satisfies(this.rebuilder.electronVersion, '^14.2.0 || ^15.3.0') && semver_1.default.major(this.rebuilder.electronVersion) < 16) {
args.push('--force-process-config');
}
return args;
}
async buildArgsFromBinaryField() {
const binary = await this.packageJSONFieldWithDefault('binary', {});
const flags = await Promise.all(Object.entries(binary).map(async ([binaryKey, binaryValue]) => {
if (binaryKey === 'napi_versions') {
return;
}
let value = binaryValue;
if (binaryKey === 'module_path') {
value = path_1.default.resolve(this.modulePath, value);
}
value = value.replace('{configuration}', this.rebuilder.buildType)
.replace('{node_abi}', `electron-v${this.rebuilder.electronVersion.split('.').slice(0, 2).join('.')}`)
.replace('{platform}', this.rebuilder.platform)
.replace('{arch}', this.rebuilder.arch)
.replace('{version}', await this.packageJSONField('version'))
.replace('{libc}', await detect_libc_1.default.family() || 'unknown');
for (const [replaceKey, replaceValue] of Object.entries(binary)) {
value = value.replace(`{${replaceKey}}`, replaceValue);
}
return `--${binaryKey}=${value}`;
}));
return flags.filter(value => value);
}
async rebuildModule() {
if (this.modulePath.includes(' ')) {
console.error('Attempting to build a module with a space in the path');
console.error('See https://github.com/nodejs/node-gyp/issues/65#issuecomment-368820565 for reasons why this may not work');
// FIXME: Re-enable the throw when more research has been done
// throw new Error(`node-gyp does not support building modules with spaces in their path, tried to build: ${modulePath}`);
}
let env;
const extraNodeGypArgs = [];
if (semver_1.default.major(this.rebuilder.electronVersion) >= 20) {
process.env.CXXFLAGS = '-std=c++17';
}
if (this.rebuilder.useElectronClang) {
env = { ...process.env };
const { env: clangEnv, args: clangArgs } = await (0, clang_fetcher_1.getClangEnvironmentVars)(this.rebuilder.electronVersion, this.rebuilder.arch);
Object.assign(process.env, clangEnv);
extraNodeGypArgs.push(...clangArgs);
}
const nodeGypArgs = await this.buildArgs(extraNodeGypArgs);
d('rebuilding', this.moduleName, 'with args', nodeGypArgs);
const nodeGyp = (0, node_gyp_1.default)();
nodeGyp.parseArgv(nodeGypArgs);
nodeGyp.devDir = constants_1.ELECTRON_GYP_DIR;
let command = nodeGyp.todo.shift();
const originalWorkingDir = process.cwd();
try {
process.chdir(this.modulePath);
while (command) {
if (command.name === 'configure') {
command.args = command.args.filter((arg) => !extraNodeGypArgs.includes(arg));
}
else if (command.name === 'build' && process.platform === 'win32') {
// This is disgusting but it prevents node-gyp from destroying our MSBuild arguments
command.args.map = (fn) => {
return Array.prototype.map.call(command.args, (arg) => {
if (arg.startsWith('/p:'))
return arg;
return fn(arg);
});
};
}
await (0, util_1.promisify)(nodeGyp.commands[command.name])(command.args);
command = nodeGyp.todo.shift();
}
}
catch (err) {
const errorMessage = `node-gyp failed to rebuild '${this.modulePath}'.
For more information, rerun with the DEBUG environment variable set to "electron-rebuild".
Error: ${err.message || err}\n\n`;
throw new Error(errorMessage);
}
finally {
process.chdir(originalWorkingDir);
}
if (this.rebuilder.useElectronClang) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
this.restoreEnv(env);
}
}
restoreEnv(env) {
const gotKeys = new Set(Object.keys(process.env));
const expectedKeys = new Set(Object.keys(env));
for (const key of Object.keys(process.env)) {
if (!expectedKeys.has(key)) {
delete process.env[key];
}
else if (env[key] !== process.env[key]) {
process.env[key] = env[key];
}
}
for (const key of Object.keys(env)) {
if (!gotKeys.has(key)) {
process.env[key] = env[key];
}
}
}
}
exports.NodeGyp = NodeGyp;
//# sourceMappingURL=node-gyp.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,12 @@
import { NativeModule } from '.';
export declare class PrebuildInstall extends NativeModule {
usesTool(): Promise<boolean>;
locateBinary(): Promise<string | null>;
run(prebuildInstallPath: string): Promise<void>;
findPrebuiltModule(): Promise<boolean>;
/**
* Whether a prebuild-install-based native module exists.
*/
prebuiltModuleExists(): Promise<boolean>;
getPrebuildInstallRuntimeArgs(): Promise<string[]>;
}

View File

@@ -0,0 +1,81 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PrebuildInstall = void 0;
const debug_1 = __importDefault(require("debug"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const path_1 = __importDefault(require("path"));
const cross_spawn_promise_1 = require("@malept/cross-spawn-promise");
const _1 = require(".");
const d = (0, debug_1.default)('electron-rebuild');
class PrebuildInstall extends _1.NativeModule {
async usesTool() {
const dependencies = await this.packageJSONFieldWithDefault('dependencies', {});
// eslint-disable-next-line no-prototype-builtins
return dependencies.hasOwnProperty('prebuild-install');
}
async locateBinary() {
return (0, _1.locateBinary)(this.modulePath, 'node_modules/prebuild-install/bin.js');
}
async run(prebuildInstallPath) {
const shimExt = process.env.ELECTRON_REBUILD_TESTS ? 'ts' : 'js';
const executable = process.env.ELECTRON_REBUILD_TESTS ? path_1.default.resolve(__dirname, '..', '..', 'node_modules', '.bin', 'ts-node') : process.execPath;
await (0, cross_spawn_promise_1.spawn)(executable, [
path_1.default.resolve(__dirname, '..', `prebuild-shim.${shimExt}`),
prebuildInstallPath,
`--arch=${this.rebuilder.arch}`,
`--platform=${this.rebuilder.platform}`,
`--tag-prefix=${this.rebuilder.prebuildTagPrefix}`,
...await this.getPrebuildInstallRuntimeArgs(),
], {
cwd: this.modulePath,
});
}
async findPrebuiltModule() {
var _a;
const prebuildInstallPath = await this.locateBinary();
if (prebuildInstallPath) {
d(`triggering prebuild download step: ${this.moduleName}`);
try {
await this.run(prebuildInstallPath);
return true;
}
catch (err) {
d('failed to use prebuild-install:', 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 prebuild-install relative to: ${this.modulePath}`);
}
return false;
}
/**
* Whether a prebuild-install-based native module exists.
*/
async prebuiltModuleExists() {
return fs_extra_1.default.pathExists(path_1.default.resolve(this.modulePath, 'prebuilds', `${this.rebuilder.platform}-${this.rebuilder.arch}`, `electron-${this.rebuilder.ABI}.node`));
}
async getPrebuildInstallRuntimeArgs() {
const moduleNapiVersions = await this.getSupportedNapiVersions();
if (moduleNapiVersions) {
const napiVersion = this.nodeAPI.getNapiVersion(moduleNapiVersions);
return [
'--runtime=napi',
`--target=${napiVersion}`,
];
}
else {
return [
'--runtime=electron',
`--target=${this.rebuilder.electronVersion}`,
];
}
}
}
exports.PrebuildInstall = PrebuildInstall;
//# sourceMappingURL=prebuild-install.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"prebuild-install.js","sourceRoot":"","sources":["../../../src/module-type/prebuild-install.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,11 @@
import { NativeModule } from '.';
export declare function determineNativePrebuildArch(arch: string): string;
/**
* The extension of `prebuildify`-generated native modules, after the last `.`. This value differs
* based on whether the target arch is ARM-based.
*/
export declare function determineNativePrebuildExtension(arch: string): string;
export declare class Prebuildify extends NativeModule {
usesTool(): Promise<boolean>;
findPrebuiltModule(): Promise<boolean>;
}

View File

@@ -0,0 +1,68 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Prebuildify = exports.determineNativePrebuildExtension = exports.determineNativePrebuildArch = void 0;
const debug_1 = __importDefault(require("debug"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const path_1 = __importDefault(require("path"));
const arch_1 = require("../arch");
const _1 = require(".");
const d = (0, debug_1.default)('electron-rebuild');
function determineNativePrebuildArch(arch) {
if (arch === 'armv7l') {
return 'arm';
}
return arch;
}
exports.determineNativePrebuildArch = determineNativePrebuildArch;
/**
* The extension of `prebuildify`-generated native modules, after the last `.`. This value differs
* based on whether the target arch is ARM-based.
*/
function determineNativePrebuildExtension(arch) {
switch (arch) {
case 'arm64':
return 'armv8.node';
case 'armv7l':
return 'armv7.node';
}
return 'node';
}
exports.determineNativePrebuildExtension = determineNativePrebuildExtension;
class Prebuildify extends _1.NativeModule {
async usesTool() {
const devDependencies = await this.packageJSONFieldWithDefault('devDependencies', {});
// eslint-disable-next-line no-prototype-builtins
return devDependencies.hasOwnProperty('prebuildify');
}
async findPrebuiltModule() {
const nodeArch = (0, arch_1.getNodeArch)(this.rebuilder.arch, process.config.variables);
d(`Checking for prebuilds for "${this.moduleName}"`);
const prebuildsDir = path_1.default.join(this.modulePath, 'prebuilds');
if (!(await fs_extra_1.default.pathExists(prebuildsDir))) {
d(`Could not find the prebuilds directory at "${prebuildsDir}"`);
return false;
}
const prebuiltModuleDir = path_1.default.join(prebuildsDir, `${this.rebuilder.platform}-${determineNativePrebuildArch(nodeArch)}`);
const nativeExt = determineNativePrebuildExtension(nodeArch);
const electronNapiModuleFilename = path_1.default.join(prebuiltModuleDir, `electron.napi.${nativeExt}`);
const nodejsNapiModuleFilename = path_1.default.join(prebuiltModuleDir, `node.napi.${nativeExt}`);
const abiModuleFilename = path_1.default.join(prebuiltModuleDir, `electron.abi${this.rebuilder.ABI}.${nativeExt}`);
if (await fs_extra_1.default.pathExists(electronNapiModuleFilename) || await fs_extra_1.default.pathExists(nodejsNapiModuleFilename)) {
this.nodeAPI.ensureElectronSupport();
d(`Found prebuilt Node-API module in ${prebuiltModuleDir}"`);
}
else if (await fs_extra_1.default.pathExists(abiModuleFilename)) {
d(`Found prebuilt module: "${abiModuleFilename}"`);
}
else {
d(`Could not locate "${electronNapiModuleFilename}", "${nodejsNapiModuleFilename}", or "${abiModuleFilename}"`);
return false;
}
return true;
}
}
exports.Prebuildify = Prebuildify;
//# sourceMappingURL=prebuildify.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"prebuildify.js","sourceRoot":"","sources":["../../../src/module-type/prebuildify.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,wDAA0B;AAC1B,gDAAwB;AAExB,kCAAuD;AACvD,wBAAiC;AAEjC,MAAM,CAAC,GAAG,IAAA,eAAK,EAAC,kBAAkB,CAAC,CAAC;AAEpC,SAAgB,2BAA2B,CAAC,IAAY;IACtD,IAAI,IAAI,KAAK,QAAQ,EAAE;QACrB,OAAO,KAAK,CAAC;KACd;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAND,kEAMC;AAED;;;GAGG;AACH,SAAgB,gCAAgC,CAAC,IAAY;IAC3D,QAAQ,IAAI,EAAE;QACZ,KAAK,OAAO;YACV,OAAO,YAAY,CAAC;QACtB,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC;KACvB;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AATD,4EASC;AAED,MAAa,WAAY,SAAQ,eAAY;IAC3C,KAAK,CAAC,QAAQ;QACZ,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACtF,iDAAiD;QACjD,OAAO,eAAe,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,QAAQ,GAAG,IAAA,kBAAW,EAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,SAA4B,CAAC,CAAC;QAE/F,CAAC,CAAC,+BAA+B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAErD,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC7D,IAAI,CAAC,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE;YACxC,CAAC,CAAC,8CAA8C,YAAY,GAAG,CAAC,CAAA;YAChE,OAAO,KAAK,CAAC;SACd;QAED,MAAM,iBAAiB,GAAG,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,2BAA2B,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzH,MAAM,SAAS,GAAG,gCAAgC,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,0BAA0B,GAAG,cAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,SAAS,EAAE,CAAC,CAAC;QAC9F,MAAM,wBAAwB,GAAG,cAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,SAAS,EAAE,CAAC,CAAC;QACxF,MAAM,iBAAiB,GAAG,cAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,eAAe,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC;QAEzG,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,0BAA0B,CAAC,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAAE;YACpG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;YACrC,CAAC,CAAC,qCAAqC,iBAAiB,GAAG,CAAC,CAAC;SAC9D;aAAM,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE;YACjD,CAAC,CAAC,2BAA2B,iBAAiB,GAAG,CAAC,CAAC;SACpD;aAAM;YACL,CAAC,CAAC,qBAAqB,0BAA0B,OAAO,wBAAwB,UAAU,iBAAiB,GAAG,CAAC,CAAC;YAChH,OAAO,KAAK,CAAC;SACd;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AApCD,kCAoCC"}

View File

@@ -0,0 +1,17 @@
export declare type ModuleType = 'prod' | 'dev' | 'optional';
export declare class ModuleWalker {
buildPath: string;
modulesToRebuild: string[];
onlyModules: string[] | null;
prodDeps: Set<string>;
projectRootPath?: string;
realModulePaths: Set<string>;
realNodeModulesPaths: Set<string>;
types: ModuleType[];
constructor(buildPath: string, projectRootPath: string | undefined, types: ModuleType[], prodDeps: Set<string>, onlyModules: string[] | null);
get nodeModulesPaths(): Promise<string[]>;
walkModules(): Promise<void>;
findModule(moduleName: string, fromDir: string, foundFn: ((p: string) => Promise<void>)): Promise<void[]>;
markChildrenAsProdDeps(modulePath: string): Promise<void>;
findAllModulesIn(nodeModulesPath: string, prefix?: string): Promise<void>;
}

View File

@@ -0,0 +1,112 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ModuleWalker = void 0;
const debug_1 = __importDefault(require("debug"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const path_1 = __importDefault(require("path"));
const read_package_json_1 = require("./read-package-json");
const search_module_1 = require("./search-module");
const d = (0, debug_1.default)('electron-rebuild');
class ModuleWalker {
constructor(buildPath, projectRootPath, types, prodDeps, onlyModules) {
this.buildPath = buildPath;
this.modulesToRebuild = [];
this.projectRootPath = projectRootPath;
this.types = types;
this.prodDeps = prodDeps;
this.onlyModules = onlyModules;
this.realModulePaths = new Set();
this.realNodeModulesPaths = new Set();
}
get nodeModulesPaths() {
return (0, search_module_1.searchForNodeModules)(this.buildPath, this.projectRootPath);
}
async walkModules() {
const rootPackageJson = await (0, read_package_json_1.readPackageJson)(this.buildPath);
const markWaiters = [];
const depKeys = [];
if (this.types.includes('prod') || this.onlyModules) {
depKeys.push(...Object.keys(rootPackageJson.dependencies || {}));
}
if (this.types.includes('optional') || this.onlyModules) {
depKeys.push(...Object.keys(rootPackageJson.optionalDependencies || {}));
}
if (this.types.includes('dev') || this.onlyModules) {
depKeys.push(...Object.keys(rootPackageJson.devDependencies || {}));
}
for (const key of depKeys) {
this.prodDeps[key] = true;
const modulePaths = await (0, search_module_1.searchForModule)(this.buildPath, key, this.projectRootPath);
for (const modulePath of modulePaths) {
markWaiters.push(this.markChildrenAsProdDeps(modulePath));
}
}
await Promise.all(markWaiters);
d('identified prod deps:', this.prodDeps);
}
async findModule(moduleName, fromDir, foundFn) {
const testPaths = await (0, search_module_1.searchForModule)(fromDir, moduleName, this.projectRootPath);
const foundFns = testPaths.map(testPath => foundFn(testPath));
return Promise.all(foundFns);
}
async markChildrenAsProdDeps(modulePath) {
if (!await fs_extra_1.default.pathExists(modulePath)) {
return;
}
d('exploring', modulePath);
let childPackageJson;
try {
childPackageJson = await (0, read_package_json_1.readPackageJson)(modulePath, true);
}
catch (err) {
return;
}
const moduleWait = [];
const callback = this.markChildrenAsProdDeps.bind(this);
for (const key of Object.keys(childPackageJson.dependencies || {}).concat(Object.keys(childPackageJson.optionalDependencies || {}))) {
if (this.prodDeps[key]) {
continue;
}
this.prodDeps[key] = true;
moduleWait.push(this.findModule(key, modulePath, callback));
}
await Promise.all(moduleWait);
}
async findAllModulesIn(nodeModulesPath, prefix = '') {
// Some package managers use symbolic links when installing node modules
// we need to be sure we've never tested the a package before by resolving
// all symlinks in the path and testing against a set
const realNodeModulesPath = await fs_extra_1.default.realpath(nodeModulesPath);
if (this.realNodeModulesPaths.has(realNodeModulesPath)) {
return;
}
this.realNodeModulesPaths.add(realNodeModulesPath);
d('scanning:', realNodeModulesPath);
for (const modulePath of await fs_extra_1.default.readdir(realNodeModulesPath)) {
// Ignore the magical .bin directory
if (modulePath === '.bin')
continue;
// Ensure that we don't mark modules as needing to be rebuilt more than once
// by ignoring / resolving symlinks
const realPath = await fs_extra_1.default.realpath(path_1.default.resolve(nodeModulesPath, modulePath));
if (this.realModulePaths.has(realPath)) {
continue;
}
this.realModulePaths.add(realPath);
if (this.prodDeps[`${prefix}${modulePath}`] && (!this.onlyModules || this.onlyModules.includes(modulePath))) {
this.modulesToRebuild.push(realPath);
}
if (modulePath.startsWith('@')) {
await this.findAllModulesIn(realPath, `${modulePath}/`);
}
if (await fs_extra_1.default.pathExists(path_1.default.resolve(nodeModulesPath, modulePath, 'node_modules'))) {
await this.findAllModulesIn(path_1.default.resolve(realPath, 'node_modules'));
}
}
}
}
exports.ModuleWalker = ModuleWalker;
//# sourceMappingURL=module-walker.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"module-walker.js","sourceRoot":"","sources":["../../src/module-walker.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,wDAA0B;AAC1B,gDAAwB;AAExB,2DAAsD;AACtD,mDAAwE;AAExE,MAAM,CAAC,GAAG,IAAA,eAAK,EAAC,kBAAkB,CAAC,CAAC;AAIpC,MAAa,YAAY;IAUvB,YAAY,SAAiB,EAAE,eAAmC,EAAE,KAAmB,EAAE,QAAqB,EAAE,WAA4B;QAC1I,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAA,oCAAoB,EACzB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,eAAe,CACrB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,eAAe,GAAG,MAAM,IAAA,mCAAe,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAoB,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,EAAE,CAAC;QAEnB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;YACnD,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;SAClE;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;YACvD,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAC;SAC1E;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;YAClD,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,CAAC;SACrE;QAED,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;YACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAC1B,MAAM,WAAW,GAAa,MAAM,IAAA,+BAAe,EACjD,IAAI,CAAC,SAAS,EACd,GAAG,EACH,IAAI,CAAC,eAAe,CACrB,CAAC;YACF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;gBACpC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC;aAC3D;SACF;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAE/B,CAAC,CAAC,uBAAuB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAkB,EAAE,OAAe,EAAE,OAAuC;QAE3F,MAAM,SAAS,GAAG,MAAM,IAAA,+BAAe,EACrC,OAAO,EACP,UAAU,EACV,IAAI,CAAC,eAAe,CACrB,CAAC;QACF,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE9D,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,UAAkB;QAC7C,IAAI,CAAC,MAAM,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;YACpC,OAAO;SACR;QAED,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC3B,IAAI,gBAAgB,CAAC;QACrB,IAAI;YACF,gBAAgB,GAAG,MAAM,IAAA,mCAAe,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;SAC5D;QAAC,OAAO,GAAG,EAAE;YACZ,OAAO;SACR;QACD,MAAM,UAAU,GAAsB,EAAE,CAAC;QAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,EAAE;YACnI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACtB,SAAS;aACV;YAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAE1B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;SAC7D;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,eAAuB,EAAE,MAAM,GAAG,EAAE;QACzD,wEAAwE;QACxE,0EAA0E;QAC1E,qDAAqD;QACrD,MAAM,mBAAmB,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC/D,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE;YACtD,OAAO;SACR;QACD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAEnD,CAAC,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;QAEpC,KAAK,MAAM,UAAU,IAAI,MAAM,kBAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE;YAC9D,oCAAoC;YACpC,IAAI,UAAU,KAAK,MAAM;gBAAE,SAAS;YACpC,4EAA4E;YAC5E,mCAAmC;YACnC,MAAM,QAAQ,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,cAAI,CAAC,OAAO,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC;YAE9E,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;gBACtC,SAAS;aACV;YACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,GAAG,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE;gBAC3G,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aACtC;YAED,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBAC9B,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,UAAU,GAAG,CAAC,CAAC;aACzD;YAED,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,cAAI,CAAC,OAAO,CAAC,eAAe,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,EAAE;gBAClF,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;aACrE;SACF;IACH,CAAC;CACF;AAzID,oCAyIC"}

View File

@@ -0,0 +1,8 @@
export declare class NodeAPI {
private moduleName;
private electronVersion;
constructor(moduleName: string, electronVersion: string);
ensureElectronSupport(): void;
getVersionForElectron(): number;
getNapiVersion(moduleNapiVersions: number[]): number;
}

View File

@@ -0,0 +1,31 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NodeAPI = void 0;
const node_api_version_1 = require("node-api-version");
class NodeAPI {
constructor(moduleName, electronVersion) {
this.moduleName = moduleName;
this.electronVersion = electronVersion;
}
ensureElectronSupport() {
this.getVersionForElectron();
}
getVersionForElectron() {
const electronNapiVersion = (0, node_api_version_1.fromElectronVersion)(this.electronVersion);
if (!electronNapiVersion) {
throw new Error(`Native module '${this.moduleName}' requires Node-API but Electron v${this.electronVersion} does not support Node-API`);
}
return electronNapiVersion;
}
getNapiVersion(moduleNapiVersions) {
const electronNapiVersion = this.getVersionForElectron();
// Filter out Node-API versions that are too high
const filteredVersions = moduleNapiVersions.filter((v) => (v <= electronNapiVersion));
if (filteredVersions.length === 0) {
throw new Error(`Native module '${this.moduleName}' supports Node-API versions ${moduleNapiVersions} but Electron v${this.electronVersion} only supports Node-API v${electronNapiVersion}`);
}
return Math.max(...filteredVersions);
}
}
exports.NodeAPI = NodeAPI;
//# sourceMappingURL=node-api.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"node-api.js","sourceRoot":"","sources":["../../src/node-api.ts"],"names":[],"mappings":";;;AAAA,uDAAyF;AAEzF,MAAa,OAAO;IAIlB,YAAY,UAAkB,EAAE,eAAuB;QACrD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAED,qBAAqB;QACnB,MAAM,mBAAmB,GAAG,IAAA,sCAA8B,EAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAEjF,IAAI,CAAC,mBAAmB,EAAE;YACxB,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,UAAU,qCAAqC,IAAI,CAAC,eAAe,4BAA4B,CAAC,CAAC;SACzI;QAED,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,cAAc,CAAC,kBAA4B;QACzC,MAAM,mBAAmB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAEzD,iDAAiD;QACjD,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC;QAEtF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,UAAU,gCAAgC,kBAAkB,kBAAkB,IAAI,CAAC,eAAe,4BAA4B,mBAAmB,EAAE,CAAC,CAAA;SAC5L;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;IACvC,CAAC;CACF;AAnCD,0BAmCC"}

View File

@@ -0,0 +1,6 @@
process.argv.splice(1, 1);
// This tricks prebuild-install into not validating on the
// 1.8.x and 8.x ABI collision
Object.defineProperty(process.versions, 'modules', { value: '-1', writable: false });
require(process.argv[1]);
//# sourceMappingURL=prebuild-shim.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"prebuild-shim.js","sourceRoot":"","sources":["../../src/prebuild-shim.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAE1B,0DAA0D;AAC1D,8BAA8B;AAC9B,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAErF,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}

View File

@@ -0,0 +1 @@
export declare function readPackageJson(dir: string, safe?: boolean): Promise<any>;

View File

@@ -0,0 +1,44 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.readPackageJson = void 0;
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
// eslint-disable-next-line @typescript-eslint/no-explicit-any
async function readPackageJson(dir, safe = false) {
try {
return await fs.readJson(path.resolve(dir, 'package.json'));
}
catch (err) {
if (safe) {
return {};
}
else {
throw err;
}
}
}
exports.readPackageJson = readPackageJson;
//# sourceMappingURL=read-package-json.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"read-package-json.js","sourceRoot":"","sources":["../../src/read-package-json.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAC/B,2CAA6B;AAE7B,8DAA8D;AACvD,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,IAAI,GAAG,KAAK;IAC7D,IAAI;QACF,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;KAC7D;IAAC,OAAO,GAAG,EAAE;QACZ,IAAI,IAAI,EAAE;YACR,OAAO,EAAE,CAAC;SACX;aAAM;YACL,MAAM,GAAG,CAAC;SACX;KACF;AACH,CAAC;AAVD,0CAUC"}

View File

@@ -0,0 +1,56 @@
/// <reference types="node" />
import { EventEmitter } from 'events';
import { BuildType, IRebuilder, RebuildMode } from './types';
import { ModuleType } from './module-walker';
export interface RebuildOptions {
buildPath: string;
electronVersion: string;
arch?: string;
extraModules?: string[];
onlyModules?: string[] | null;
force?: boolean;
headerURL?: string;
types?: ModuleType[];
mode?: RebuildMode;
debug?: boolean;
useCache?: boolean;
useElectronClang?: boolean;
cachePath?: string;
prebuildTagPrefix?: string;
projectRootPath?: string;
forceABI?: number;
disablePreGypCopy?: boolean;
}
export interface RebuilderOptions extends RebuildOptions {
lifecycle: EventEmitter;
}
export declare class Rebuilder implements IRebuilder {
private ABIVersion;
private moduleWalker;
nodeGypPath: string;
rebuilds: (() => Promise<void>)[];
lifecycle: EventEmitter;
buildPath: string;
electronVersion: string;
platform: string;
arch: string;
force: boolean;
headerURL: string;
mode: RebuildMode;
debug: boolean;
useCache: boolean;
cachePath: string;
prebuildTagPrefix: string;
msvsVersion?: string;
useElectronClang: boolean;
disablePreGypCopy: boolean;
constructor(options: RebuilderOptions);
get ABI(): string;
get buildType(): BuildType;
rebuild(): Promise<void>;
rebuildModuleAt(modulePath: string): Promise<void>;
}
export declare type RebuildResult = Promise<void> & {
lifecycle: EventEmitter;
};
export declare function rebuild(options: RebuildOptions): RebuildResult;

View File

@@ -0,0 +1,166 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.rebuild = exports.Rebuilder = void 0;
const debug_1 = __importDefault(require("debug"));
const events_1 = require("events");
const fs = __importStar(require("fs-extra"));
const nodeAbi = __importStar(require("node-abi"));
const os = __importStar(require("os"));
const path = __importStar(require("path"));
const cache_1 = require("./cache");
const types_1 = require("./types");
const module_rebuilder_1 = require("./module-rebuilder");
const module_walker_1 = require("./module-walker");
const d = (0, debug_1.default)('electron-rebuild');
const defaultMode = 'sequential';
const defaultTypes = ['prod', 'optional'];
class Rebuilder {
constructor(options) {
var _a;
this.platform = process.platform;
this.lifecycle = options.lifecycle;
this.buildPath = options.buildPath;
this.electronVersion = options.electronVersion;
this.arch = options.arch || process.arch;
this.force = options.force || false;
this.headerURL = options.headerURL || 'https://www.electronjs.org/headers';
this.mode = options.mode || defaultMode;
this.debug = options.debug || false;
this.useCache = options.useCache || false;
this.useElectronClang = options.useElectronClang || false;
this.cachePath = options.cachePath || path.resolve(os.homedir(), '.electron-rebuild-cache');
this.prebuildTagPrefix = options.prebuildTagPrefix || 'v';
this.msvsVersion = process.env.GYP_MSVS_VERSION;
this.disablePreGypCopy = options.disablePreGypCopy || false;
if (this.useCache && this.force) {
console.warn('[WARNING]: Electron Rebuild has force enabled and cache enabled, force take precedence and the cache will not be used.');
this.useCache = false;
}
if (typeof this.electronVersion === 'number') {
if (`${this.electronVersion}`.split('.').length === 1) {
this.electronVersion = `${this.electronVersion}.0.0`;
}
else {
this.electronVersion = `${this.electronVersion}.0`;
}
}
if (typeof this.electronVersion !== 'string') {
throw new Error(`Expected a string version for electron version, got a "${typeof this.electronVersion}"`);
}
this.ABIVersion = (_a = options.forceABI) === null || _a === void 0 ? void 0 : _a.toString();
const onlyModules = options.onlyModules || null;
const extraModules = (options.extraModules || []).reduce((acc, x) => acc.add(x), new Set());
const types = options.types || defaultTypes;
this.moduleWalker = new module_walker_1.ModuleWalker(this.buildPath, options.projectRootPath, types, extraModules, onlyModules);
this.rebuilds = [];
d('rebuilding with args:', this.buildPath, this.electronVersion, this.arch, extraModules, this.force, this.headerURL, types, this.debug);
}
get ABI() {
if (this.ABIVersion === undefined) {
this.ABIVersion = nodeAbi.getAbi(this.electronVersion, 'electron');
}
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
return this.ABIVersion;
}
get buildType() {
return this.debug ? types_1.BuildType.Debug : types_1.BuildType.Release;
}
async rebuild() {
if (!path.isAbsolute(this.buildPath)) {
throw new Error('Expected buildPath to be an absolute path');
}
this.lifecycle.emit('start');
await this.moduleWalker.walkModules();
for (const nodeModulesPath of await this.moduleWalker.nodeModulesPaths) {
await this.moduleWalker.findAllModulesIn(nodeModulesPath);
}
for (const modulePath of this.moduleWalker.modulesToRebuild) {
this.rebuilds.push(() => this.rebuildModuleAt(modulePath));
}
this.rebuilds.push(() => this.rebuildModuleAt(this.buildPath));
if (this.mode !== 'sequential') {
await Promise.all(this.rebuilds.map(fn => fn()));
}
else {
for (const rebuildFn of this.rebuilds) {
await rebuildFn();
}
}
}
async rebuildModuleAt(modulePath) {
if (!(await fs.pathExists(path.resolve(modulePath, 'binding.gyp')))) {
return;
}
const moduleRebuilder = new module_rebuilder_1.ModuleRebuilder(this, modulePath);
this.lifecycle.emit('module-found', path.basename(modulePath));
if (!this.force && await moduleRebuilder.alreadyBuiltByRebuild()) {
d(`skipping: ${path.basename(modulePath)} as it is already built`);
this.lifecycle.emit('module-done');
this.lifecycle.emit('module-skip');
return;
}
if (await moduleRebuilder.prebuildInstallNativeModuleExists()) {
d(`skipping: ${path.basename(modulePath)} as it was prebuilt`);
return;
}
let cacheKey;
if (this.useCache) {
cacheKey = await (0, cache_1.generateCacheKey)({
ABI: this.ABI,
arch: this.arch,
debug: this.debug,
electronVersion: this.electronVersion,
headerURL: this.headerURL,
modulePath,
});
const applyDiffFn = await (0, cache_1.lookupModuleState)(this.cachePath, cacheKey);
if (typeof applyDiffFn === 'function') {
await applyDiffFn(modulePath);
this.lifecycle.emit('module-done');
return;
}
}
if (await moduleRebuilder.rebuild(cacheKey)) {
this.lifecycle.emit('module-done');
}
}
}
exports.Rebuilder = Rebuilder;
function rebuild(options) {
// eslint-disable-next-line prefer-rest-params
d('rebuilding with args:', arguments);
const lifecycle = new events_1.EventEmitter();
const rebuilderOptions = { ...options, lifecycle };
const rebuilder = new Rebuilder(rebuilderOptions);
const ret = rebuilder.rebuild();
ret.lifecycle = lifecycle;
return ret;
}
exports.rebuild = rebuild;
//# sourceMappingURL=rebuild.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,23 @@
/**
* Find all instances of a given module in node_modules subdirectories while traversing up
* ancestor directories.
*
* @param cwd the initial directory to traverse
* @param moduleName the Node module name (should work for scoped modules as well)
* @param rootPath the project's root path. If provided, the traversal will stop at this path.
*/
export declare function searchForModule(cwd: string, moduleName: string, rootPath?: string): Promise<string[]>;
/**
* Find all instances of node_modules subdirectories while traversing up ancestor directories.
*
* @param cwd the initial directory to traverse
* @param rootPath the project's root path. If provided, the traversal will stop at this path.
*/
export declare function searchForNodeModules(cwd: string, rootPath?: string): Promise<string[]>;
/**
* Determine the root directory of a given project, by looking for a directory with an
* NPM or yarn lockfile.
*
* @param cwd the initial directory to traverse
*/
export declare function getProjectRootPath(cwd: string): Promise<string>;

View File

@@ -0,0 +1,97 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getProjectRootPath = exports.searchForNodeModules = exports.searchForModule = void 0;
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
async function shouldContinueSearch(traversedPath, rootPath, stopAtPackageJSON) {
if (rootPath) {
return Promise.resolve(traversedPath !== path.dirname(rootPath));
}
else if (stopAtPackageJSON) {
return fs.pathExists(path.join(traversedPath, 'package.json'));
}
else {
return true;
}
}
async function traverseAncestorDirectories(cwd, pathGenerator, rootPath, maxItems, stopAtPackageJSON) {
const paths = [];
let traversedPath = path.resolve(cwd);
while (await shouldContinueSearch(traversedPath, rootPath, stopAtPackageJSON)) {
const generatedPath = pathGenerator(traversedPath);
if (await fs.pathExists(generatedPath)) {
paths.push(generatedPath);
}
const parentPath = path.dirname(traversedPath);
if (parentPath === traversedPath || (maxItems && paths.length >= maxItems)) {
break;
}
traversedPath = parentPath;
}
return paths;
}
/**
* Find all instances of a given module in node_modules subdirectories while traversing up
* ancestor directories.
*
* @param cwd the initial directory to traverse
* @param moduleName the Node module name (should work for scoped modules as well)
* @param rootPath the project's root path. If provided, the traversal will stop at this path.
*/
async function searchForModule(cwd, moduleName, rootPath) {
const pathGenerator = (traversedPath) => path.join(traversedPath, 'node_modules', moduleName);
return traverseAncestorDirectories(cwd, pathGenerator, rootPath, undefined, true);
}
exports.searchForModule = searchForModule;
/**
* Find all instances of node_modules subdirectories while traversing up ancestor directories.
*
* @param cwd the initial directory to traverse
* @param rootPath the project's root path. If provided, the traversal will stop at this path.
*/
async function searchForNodeModules(cwd, rootPath) {
const pathGenerator = (traversedPath) => path.join(traversedPath, 'node_modules');
return traverseAncestorDirectories(cwd, pathGenerator, rootPath, undefined, true);
}
exports.searchForNodeModules = searchForNodeModules;
/**
* Determine the root directory of a given project, by looking for a directory with an
* NPM or yarn lockfile.
*
* @param cwd the initial directory to traverse
*/
async function getProjectRootPath(cwd) {
for (const lockFilename of ['yarn.lock', 'package-lock.json']) {
const pathGenerator = (traversedPath) => path.join(traversedPath, lockFilename);
const lockPaths = await traverseAncestorDirectories(cwd, pathGenerator, undefined, 1);
if (lockPaths.length > 0) {
return path.dirname(lockPaths[0]);
}
}
return cwd;
}
exports.getProjectRootPath = getProjectRootPath;
//# sourceMappingURL=search-module.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"search-module.js","sourceRoot":"","sources":["../../src/search-module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAC/B,2CAA6B;AAE7B,KAAK,UAAU,oBAAoB,CAAC,aAAqB,EAAE,QAAiB,EAAE,iBAA2B;IACvG,IAAI,QAAQ,EAAE;QACZ,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;KAClE;SAAM,IAAI,iBAAiB,EAAE;QAC5B,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;KAChE;SAAM;QACL,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AAID,KAAK,UAAU,2BAA2B,CACxC,GAAW,EACX,aAAoC,EACpC,QAAiB,EACjB,QAAiB,EACjB,iBAA2B;IAE3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEtC,OAAO,MAAM,oBAAoB,CAAC,aAAa,EAAE,QAAQ,EAAE,iBAAiB,CAAC,EAAE;QAC7E,MAAM,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;QACnD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;YACtC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SAC3B;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,UAAU,KAAK,aAAa,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC,EAAE;YAC1E,MAAM;SACP;QACD,aAAa,GAAG,UAAU,CAAC;KAC5B;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,eAAe,CACnC,GAAW,EACX,UAAkB,EAClB,QAAiB;IAEjB,MAAM,aAAa,GAA0B,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;IACrH,OAAO,2BAA2B,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AACpF,CAAC;AAPD,0CAOC;AAED;;;;;GAKG;AACI,KAAK,UAAU,oBAAoB,CAAC,GAAW,EAAE,QAAiB;IACvE,MAAM,aAAa,GAA0B,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IACzG,OAAO,2BAA2B,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AACpF,CAAC;AAHD,oDAGC;AAED;;;;;GAKG;AACI,KAAK,UAAU,kBAAkB,CAAC,GAAW;IAClD,KAAK,MAAM,YAAY,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,EAAE;QAC7D,MAAM,aAAa,GAA0B,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QACvG,MAAM,SAAS,GAAG,MAAM,2BAA2B,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;QACrF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACxB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;SACnC;KACF;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAVD,gDAUC"}

View File

@@ -0,0 +1 @@
export declare function downloadLinuxSysroot(electronVersion: string, targetArch: string): Promise<string>;

View File

@@ -0,0 +1,74 @@
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.downloadLinuxSysroot = void 0;
const crypto = __importStar(require("crypto"));
const debug_1 = __importDefault(require("debug"));
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
const tar = __importStar(require("tar"));
const constants_1 = require("./constants");
const fetcher_1 = require("./fetcher");
const d = (0, debug_1.default)('electron-rebuild');
const sysrootArchAliases = {
x64: 'amd64',
ia32: 'i386',
};
const SYSROOT_BASE_URL = 'https://s3.amazonaws.com/electronjs-sysroots/toolchain';
async function downloadLinuxSysroot(electronVersion, targetArch) {
d('fetching sysroot for Electron:', electronVersion);
const sysrootDir = path.resolve(constants_1.ELECTRON_GYP_DIR, `${electronVersion}-sysroot`);
if (await fs.pathExists(path.resolve(sysrootDir, 'lib')))
return sysrootDir;
if (!await fs.pathExists(sysrootDir))
await fs.mkdirp(sysrootDir);
const linuxArch = sysrootArchAliases[targetArch] || targetArch;
const electronSysroots = JSON.parse(await (0, fetcher_1.fetch)(`https://raw.githubusercontent.com/electron/electron/v${electronVersion}/script/sysroots.json`, 'text'));
const { Sha1Sum: sha, Tarball: fileName } = electronSysroots[`sid_${linuxArch}`];
const sysrootURL = `${SYSROOT_BASE_URL}/${sha}/${fileName}`;
let sysrootBuffer = await (0, fetcher_1.fetch)(sysrootURL, 'buffer');
const actualSha = crypto.createHash('SHA1').update(sysrootBuffer).digest('hex');
d('expected sha:', sha);
d('actual sha:', actualSha);
if (sha !== actualSha)
throw new Error(`Attempted to download the linux sysroot for ${electronVersion} but the SHA checksum did not match`);
d('decompressing sysroot');
sysrootBuffer = await new Promise(resolve => require('lzma-native').decompress(sysrootBuffer, undefined, (result) => resolve(result))); // eslint-disable-line
const tmpTarFile = path.resolve(constants_1.ELECTRON_GYP_DIR, `${electronVersion}-${fileName}`);
if (await fs.pathExists(tmpTarFile))
await fs.remove(tmpTarFile);
await fs.writeFile(tmpTarFile, sysrootBuffer);
d('extracting sysroot');
await tar.x({
file: tmpTarFile,
cwd: sysrootDir,
});
return sysrootDir;
}
exports.downloadLinuxSysroot = downloadLinuxSysroot;
//# sourceMappingURL=sysroot-fetcher.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"sysroot-fetcher.js","sourceRoot":"","sources":["../../src/sysroot-fetcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,kDAA0B;AAC1B,6CAA+B;AAC/B,2CAA6B;AAC7B,yCAA2B;AAE3B,2CAA+C;AAC/C,uCAAkC;AAElC,MAAM,CAAC,GAAG,IAAA,eAAK,EAAC,kBAAkB,CAAC,CAAC;AAEpC,MAAM,kBAAkB,GAAG;IACzB,GAAG,EAAE,OAAO;IACZ,IAAI,EAAE,MAAM;CACb,CAAA;AAED,MAAM,gBAAgB,GAAG,wDAAwD,CAAA;AAE1E,KAAK,UAAU,oBAAoB,CAAC,eAAuB,EAAE,UAAkB;IACpF,CAAC,CAAC,gCAAgC,EAAE,eAAe,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,4BAAgB,EAAE,GAAG,eAAe,UAAU,CAAC,CAAC;IAChF,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IAC5E,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,kBAAkB,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;IAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,eAAK,EAAC,wDAAwD,eAAe,uBAAuB,EAAE,MAAM,CAAC,CAAC,CAAC;IAEzJ,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,OAAO,SAAS,EAAE,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,GAAG,gBAAgB,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC5D,IAAI,aAAa,GAAG,MAAM,IAAA,eAAK,EAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEtD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC5B,IAAI,GAAG,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,eAAe,qCAAqC,CAAC,CAAC;IAE5I,CAAC,CAAC,uBAAuB,CAAC,CAAC;IAC3B,aAAa,GAAG,MAAM,IAAI,OAAO,CAAS,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;IAE9K,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,4BAAgB,EAAE,GAAG,eAAe,IAAI,QAAQ,EAAE,CAAC,CAAC;IACpF,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAE9C,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACxB,MAAM,GAAG,CAAC,CAAC,CAAC;QACV,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,UAAU;KAChB,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACpB,CAAC;AAhCD,oDAgCC"}

View File

@@ -0,0 +1,26 @@
/// <reference types="node" />
import { EventEmitter } from 'events';
export declare enum BuildType {
Debug = "Debug",
Release = "Release"
}
export declare type RebuildMode = 'sequential' | 'parallel';
export interface IRebuilder {
ABI: string;
arch: string;
buildPath: string;
buildType: BuildType;
cachePath: string;
debug: boolean;
disablePreGypCopy: boolean;
electronVersion: string;
force: boolean;
headerURL: string;
lifecycle: EventEmitter;
mode: RebuildMode;
msvsVersion?: string;
platform: string;
prebuildTagPrefix: string;
useCache: boolean;
useElectronClang: boolean;
}

View File

@@ -0,0 +1,9 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BuildType = void 0;
var BuildType;
(function (BuildType) {
BuildType["Debug"] = "Debug";
BuildType["Release"] = "Release";
})(BuildType = exports.BuildType || (exports.BuildType = {}));
//# sourceMappingURL=types.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";;;AAEA,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,4BAAe,CAAA;IACf,gCAAmB,CAAA;AACrB,CAAC,EAHW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAGpB"}