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,162 @@
## Electron Rebuild
[![CircleCI](https://circleci.com/gh/electron/electron-rebuild.svg?style=svg)](https://circleci.com/gh/electron/electron-rebuild)
[![NPM](https://img.shields.io/npm/v/electron-rebuild.svg?style=flat)](https://npm.im/electron-rebuild)
[![Coverage Status](https://codecov.io/gh/electron/electron-rebuild/branch/master/graph/badge.svg)](https://codecov.io/gh/electron/electron-rebuild)
This executable rebuilds native Node.js modules against the version of Node.js
that your Electron project is using. This allows you to use native Node.js
modules in Electron apps without your system version of Node.js matching exactly
(which is often not the case, and sometimes not even possible).
### How does it work?
Install the package with `--save-dev`:
```sh
npm install --save-dev electron-rebuild
```
Then, whenever you install a new npm package, rerun electron-rebuild:
```sh
$(npm bin)/electron-rebuild
```
Or if you're on Windows:
```sh
.\node_modules\.bin\electron-rebuild.cmd
```
If you have a good node-gyp config but you see an error about a missing element on Windows like `Could not load the Visual C++ component "VCBuild.exe"`, try to launch electron-rebuild in an npm script:
```json
"scripts": {
"rebuild": "electron-rebuild -f -w yourmodule"
}
```
and then
```sh
npm run rebuild
```
### What are the requirements?
Node v12.13.0 or higher is required. Building native modules from source uses
[`node-gyp`](https://github.com/nodejs/node-gyp#installation), refer to the link for its
installation/runtime requirements.
### CLI Arguments
```
Usage: electron-rebuild --version [version] --module-dir [path]
Options:
-h, --help Show help [boolean]
-v, --version The version of Electron to build against
-f, --force Force rebuilding modules, even if we would skip
it otherwise
-a, --arch Override the target architecture to something
other than your system's
-m, --module-dir The path to the app directory to rebuild
-w, --which-module 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).
-e, --electron-prebuilt-dir The path to the prebuilt electron module
-d, --dist-url Custom header tarball URL
-t, --types The types of dependencies to rebuild. Comma
separated list of "prod", "dev" and "optional".
Default is "prod,optional"
-p, --parallel Rebuild in parallel, this is enabled by default
on macOS and Linux
-s, --sequential Rebuild modules sequentially, this is enabled by
default on Windows
-o, --only Only build specified module, or comma separated
list of modules. All others are ignored.
-b, --debug Build debug version of modules
--prebuild-tag-prefix GitHub tag prefix passed to prebuild-install.
Default is "v"
Copyright 2016
```
### How can I use this with [Electron Forge](https://github.com/electron-userland/electron-forge)?
This package is automatically used with Electron Forge when packaging an Electron app.
### How can I integrate this into [Electron Packager](https://github.com/electron/electron-packager)?
electron-rebuild provides a function compatible with the [`afterCopy` hook](https://electron.github.io/electron-packager/main/interfaces/electronpackager.options.html#aftercopy)
for Electron Packager. For example:
```javascript
import packager from 'electron-packager';
import rebuild from 'electron-rebuild';
packager({
// … other options
afterCopy: [(buildPath, electronVersion, platform, arch, callback) => {
rebuild({ buildPath, electronVersion, arch })
.then(() => callback())
.catch((error) => callback(error));
}],
// … other options
});
```
### How can I integrate this with [prebuild](https://github.com/prebuild/prebuild)?
If your module uses [prebuild](https://github.com/prebuild/prebuild) for creating prebuilt binaries,
it also uses [prebuild-install](https://github.com/prebuild/prebuild-install) to download them. If
this is the case, then `electron-rebuild` will run `prebuild-install` to download the correct
binaries from the project's GitHub Releases instead of rebuilding them.
### How can I integrate this into Grunt / Gulp / Whatever?
electron-rebuild is also a library that you can require into your app or
build process. It has a very simple API:
```javascript
import rebuild from 'electron-rebuild';
// Public: Rebuilds a node_modules directory with the given Electron version.
//
// options: Object with the following properties
// buildPath - An absolute path to your app's directory. (The directory that contains your node_modules)
// electronVersion - The version of Electron to rebuild for
// arch (optional) - Default: process.arch - The arch to rebuild for
// extraModules (optional) - Default: [] - An array of modules to rebuild as well as the detected modules
// onlyModules (optional) - Default: null - An array of modules to rebuild, ONLY these module names will be rebuilt.
// The "types" property will be ignored if this option is set.
// force (optional) - Default: false - Force a rebuild of modules regardless of their current build state
// headerURL (optional) - Default: https://www.electronjs.org/headers - The URL to download Electron header files from
// types (optional) - Default: ['prod', 'optional'] - The types of modules to rebuild
// mode (optional) - The rebuild mode, either 'sequential' or 'parallel' - Default varies per platform (probably shouldn't mess with this one)
// useElectronClang (optional) - Whether to use the clang executable that Electron used when building its binary. This will guarantee compiler compatibility
// Returns a Promise indicating whether the operation succeeded or not
```
A full build process might look something like:
```javascript
const childProcess = require('child_process');
const pathToElectron = require('electron');
rebuild({
buildPath: __dirname,
electronVersion: '1.4.12'
})
.then(() => console.info('Rebuild Successful'))
.catch((e) => {
console.error("Building modules didn't work!");
console.error(e);
});
```
### Alternatives
- [require-rebuild](https://github.com/juliangruber/require-rebuild) patches `require()` to rebuild native node modules on the fly

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":"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"}

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"}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,37 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const chai_1 = require("chai");
const arch_1 = require("../src/arch");
// Copied from @electron/get
describe('uname()', () => {
if (process.platform !== 'win32') {
it('should return the correct arch for your system', () => {
// assumes that the tests will always be run on an x64 system 😬
(0, chai_1.expect)((0, arch_1.uname)()).to.equal('x86_64');
});
}
});
// Based on getHostArch tests from @electron/get
describe('getNodeArch()', () => {
it('should return process.arch on x64', () => {
(0, chai_1.expect)((0, arch_1.getNodeArch)('x64', {})).to.equal('x64');
});
it('should return process.arch on ia32', () => {
(0, chai_1.expect)((0, arch_1.getNodeArch)('ia32', {})).to.equal('ia32');
});
it('should return process.arch on arm64', () => {
(0, chai_1.expect)((0, arch_1.getNodeArch)('arm64', {})).to.equal('arm64');
});
it('should return process.arch on unknown arm', () => {
(0, chai_1.expect)((0, arch_1.getNodeArch)('arm', {})).to.equal('armv7l');
});
if (process.platform !== 'win32') {
it('should return uname on arm 6', () => {
(0, chai_1.expect)((0, arch_1.getNodeArch)('arm', { arm_version: '6' })).to.equal((0, arch_1.uname)());
});
}
it('should return armv7l on arm 7', () => {
(0, chai_1.expect)((0, arch_1.getNodeArch)('arm', { arm_version: '7' })).to.equal('armv7l');
});
});
//# sourceMappingURL=arch.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"arch.js","sourceRoot":"","sources":["../../test/arch.ts"],"names":[],"mappings":";;AAAA,+BAA8B;AAE9B,sCAAiD;AAEjD,4BAA4B;AAC5B,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE;QAChC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,gEAAgE;YAChE,IAAA,aAAM,EAAC,IAAA,YAAK,GAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;KACJ;AACH,CAAC,CAAC,CAAC;AAEH,gDAAgD;AAChD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,IAAA,aAAM,EAAC,IAAA,kBAAW,EAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,IAAA,aAAM,EAAC,IAAA,kBAAW,EAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,IAAA,aAAM,EAAC,IAAA,kBAAW,EAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,IAAA,aAAM,EAAC,IAAA,kBAAW,EAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE;QAChC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,IAAA,aAAM,EAAC,IAAA,kBAAW,EAAC,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAA,YAAK,GAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;KACJ;IAED,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,IAAA,aAAM,EAAC,IAAA,kBAAW,EAAC,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,70 @@
"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 });
const chai_1 = require("chai");
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
const electron_locator_1 = require("../src/electron-locator");
const baseFixtureDir = path.resolve(__dirname, 'fixture', 'electron-locator');
async function expectElectronCanBeFound(projectRootPath, startDir) {
it('should return a valid path', async () => {
const electronPath = await (0, electron_locator_1.locateElectronModule)(projectRootPath, startDir);
(0, chai_1.expect)(electronPath).to.be.a('string');
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
(0, chai_1.expect)(await fs.pathExists(electronPath)).to.be.equal(true);
});
}
describe('locateElectronModule', () => {
describe('when electron is not installed', () => {
const electronDir = path.resolve(__dirname, '..', 'node_modules', 'electron');
before(async () => {
await fs.rename(electronDir, `${electronDir}-moved`);
});
it('should return null when electron is not installed', async () => {
const fixtureDir = path.join(baseFixtureDir, 'not-installed');
(0, chai_1.expect)(await (0, electron_locator_1.locateElectronModule)(fixtureDir, fixtureDir)).to.be.equal(null);
});
after(async () => {
await fs.rename(`${electronDir}-moved`, electronDir);
});
});
describe('using require.resolve() in the current project to search', () => {
const fixtureDir = path.join(baseFixtureDir, 'not-installed');
expectElectronCanBeFound(fixtureDir, fixtureDir);
});
describe('with electron-prebuilt-compile installed', () => {
const fixtureDir = path.join(baseFixtureDir, 'prebuilt-compile');
expectElectronCanBeFound(fixtureDir, fixtureDir);
});
describe('with electron installed', () => {
const fixtureDir = path.join(baseFixtureDir, 'single');
expectElectronCanBeFound(fixtureDir, fixtureDir);
describe('in a workspace', () => {
const fixtureDir = path.join(baseFixtureDir, 'workspace');
expectElectronCanBeFound(fixtureDir, path.join(fixtureDir, 'packages', 'descendant'));
});
});
});
//# sourceMappingURL=electron-locator.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"electron-locator.js","sourceRoot":"","sources":["../../test/electron-locator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+BAA8B;AAC9B,6CAA+B;AAC/B,2CAA6B;AAE7B,8DAA+D;AAE/D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAA;AAE7E,KAAK,UAAU,wBAAwB,CAAC,eAAuB,EAAE,QAAgB;IAC/E,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,YAAY,GAAG,MAAM,IAAA,uCAAoB,EAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAC3E,IAAA,aAAM,EAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvC,oEAAoE;QACpE,IAAA,aAAM,EAAC,MAAM,EAAE,CAAC,UAAU,CAAC,YAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;QAE9E,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,WAAW,QAAQ,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;YAC9D,IAAA,aAAM,EAAC,MAAM,IAAA,uCAAoB,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,WAAW,QAAQ,EAAE,WAAW,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACxE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;QAC9D,wBAAwB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACjE,wBAAwB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACvD,wBAAwB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAEjD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;YAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YAC1D,wBAAwB,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}

View File

@@ -0,0 +1 @@
export declare function getExactElectronVersionSync(): string;

View File

@@ -0,0 +1,43 @@
"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.getExactElectronVersionSync = void 0;
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
function electronVersionPath() {
// eslint-disable-next-line @typescript-eslint/no-var-requires
const electronPath = require('electron');
if (process.platform === 'darwin') {
return path.resolve(path.dirname(electronPath), '..', '..', '..', 'version');
}
else {
return path.join(path.dirname(electronPath), 'version');
}
}
function getExactElectronVersionSync() {
return fs.readFileSync(electronVersionPath()).toString().trim();
}
exports.getExactElectronVersionSync = getExactElectronVersionSync;
//# sourceMappingURL=electron-version.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"electron-version.js","sourceRoot":"","sources":["../../../test/helpers/electron-version.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAC/B,2CAA6B;AAE7B,SAAS,mBAAmB;IAC1B,8DAA8D;IAC9D,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;KAC9E;SAAM;QACL,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC;KACzD;AACH,CAAC;AAED,SAAgB,2BAA2B;IACzC,OAAO,EAAE,CAAC,YAAY,CAAC,mBAAmB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;AAClE,CAAC;AAFD,kEAEC"}

View File

@@ -0,0 +1,5 @@
export declare const MINUTES_IN_MILLISECONDS: number;
export declare const TIMEOUT_IN_MILLISECONDS: number;
export declare function resetMSVSVersion(): void;
export declare function resetTestModule(testModulePath: string, installModules?: boolean): Promise<void>;
export declare function cleanupTestModule(testModulePath: string): Promise<void>;

View File

@@ -0,0 +1,35 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.cleanupTestModule = exports.resetTestModule = exports.resetMSVSVersion = exports.TIMEOUT_IN_MILLISECONDS = exports.MINUTES_IN_MILLISECONDS = void 0;
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 originalGypMSVSVersion = process.env.GYP_MSVS_VERSION;
const TIMEOUT_IN_MINUTES = process.platform === 'win32' ? 5 : 2;
exports.MINUTES_IN_MILLISECONDS = 60 * 1000;
exports.TIMEOUT_IN_MILLISECONDS = TIMEOUT_IN_MINUTES * exports.MINUTES_IN_MILLISECONDS;
function resetMSVSVersion() {
if (originalGypMSVSVersion) {
process.env.GYP_MSVS_VERSION = originalGypMSVSVersion;
}
}
exports.resetMSVSVersion = resetMSVSVersion;
async function resetTestModule(testModulePath, installModules = true) {
await fs_extra_1.default.remove(testModulePath);
await fs_extra_1.default.mkdir(testModulePath, { recursive: true });
await fs_extra_1.default.copyFile(path_1.default.resolve(__dirname, '../../test/fixture/native-app1/package.json'), path_1.default.resolve(testModulePath, 'package.json'));
if (installModules) {
await (0, cross_spawn_promise_1.spawn)('npm', ['install'], { cwd: testModulePath });
}
resetMSVSVersion();
}
exports.resetTestModule = resetTestModule;
async function cleanupTestModule(testModulePath) {
await fs_extra_1.default.remove(testModulePath);
resetMSVSVersion();
}
exports.cleanupTestModule = cleanupTestModule;
//# sourceMappingURL=module-setup.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"module-setup.js","sourceRoot":"","sources":["../../../test/helpers/module-setup.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA0B;AAC1B,gDAAwB;AACxB,qEAAoD;AAEpD,MAAM,sBAAsB,GAAuB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAChF,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnD,QAAA,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAC;AACpC,QAAA,uBAAuB,GAAG,kBAAkB,GAAG,+BAAuB,CAAC;AAEpF,SAAgB,gBAAgB;IAC9B,IAAI,sBAAsB,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,sBAAsB,CAAC;KACvD;AACH,CAAC;AAJD,4CAIC;AAEM,KAAK,UAAU,eAAe,CAAC,cAAsB,EAAE,cAAc,GAAG,IAAI;IACjF,MAAM,kBAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAChC,MAAM,kBAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,kBAAE,CAAC,QAAQ,CACf,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,6CAA6C,CAAC,EACtE,cAAI,CAAC,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,CAC7C,CAAC;IACF,IAAI,cAAc,EAAE;QAClB,MAAM,IAAA,2BAAK,EAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC;KAC1D;IACD,gBAAgB,EAAE,CAAC;AACrB,CAAC;AAXD,0CAWC;AAEM,KAAK,UAAU,iBAAiB,CAAC,cAAsB;IAC5D,MAAM,kBAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAChC,gBAAgB,EAAE,CAAC;AACrB,CAAC;AAHD,8CAGC"}

View File

@@ -0,0 +1,7 @@
declare type ExpectRebuildOptions = {
buildType?: string;
metaShouldExist?: boolean;
};
export declare function expectNativeModuleToBeRebuilt(basePath: string, modulePath: string, options?: ExpectRebuildOptions): Promise<void>;
export declare function expectNativeModuleToNotBeRebuilt(basePath: string, modulePath: string, options?: ExpectRebuildOptions): Promise<void>;
export {};

View File

@@ -0,0 +1,42 @@
"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.expectNativeModuleToNotBeRebuilt = exports.expectNativeModuleToBeRebuilt = void 0;
const chai_1 = require("chai");
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
async function expectNativeModuleToBeRebuilt(basePath, modulePath, options = {}) {
const metaShouldExist = Object.prototype.hasOwnProperty.call(options, 'metaShouldExist') ? options.metaShouldExist : true;
const message = `${path.basename(modulePath)} build meta should ${metaShouldExist ? '' : 'not '}exist`;
const buildType = options.buildType || 'Release';
const metaPath = path.resolve(basePath, 'node_modules', modulePath, 'build', buildType, '.forge-meta');
(0, chai_1.expect)(await fs.pathExists(metaPath), message).to.equal(metaShouldExist);
}
exports.expectNativeModuleToBeRebuilt = expectNativeModuleToBeRebuilt;
async function expectNativeModuleToNotBeRebuilt(basePath, modulePath, options = {}) {
await expectNativeModuleToBeRebuilt(basePath, modulePath, { ...options, metaShouldExist: false });
}
exports.expectNativeModuleToNotBeRebuilt = expectNativeModuleToNotBeRebuilt;
//# sourceMappingURL=rebuild.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../../../test/helpers/rebuild.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+BAA8B;AAC9B,6CAA+B;AAC/B,2CAA6B;AAOtB,KAAK,UAAU,6BAA6B,CACjD,QAAgB,EAChB,UAAkB,EAClB,UAAgC,EAAE;IAElC,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1H,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,sBAAsB,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC;IACvG,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;IACvG,IAAA,aAAM,EAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAC3E,CAAC;AAVD,sEAUC;AAEM,KAAK,UAAU,gCAAgC,CACpD,QAAgB,EAChB,UAAkB,EAClB,UAAgC,EAAE;IAElC,MAAM,6BAA6B,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;AACpG,CAAC;AAND,4EAMC"}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,57 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const events_1 = require("events");
const chai_1 = require("chai");
const os_1 = __importDefault(require("os"));
const path_1 = __importDefault(require("path"));
const module_setup_1 = require("./helpers/module-setup");
const node_gyp_1 = require("../src/module-type/node-gyp");
const rebuild_1 = require("../src/rebuild");
describe('node-gyp', () => {
describe('buildArgs', () => {
const testModulePath = path_1.default.resolve(os_1.default.tmpdir(), 'electron-rebuild-test');
before(async () => await (0, module_setup_1.resetTestModule)(testModulePath, false));
after(async () => await (0, module_setup_1.cleanupTestModule)(testModulePath));
function nodeGypArgsForElectronVersion(electronVersion) {
const rebuilder = new rebuild_1.Rebuilder({
buildPath: testModulePath,
electronVersion: electronVersion,
lifecycle: new events_1.EventEmitter()
});
const nodeGyp = new node_gyp_1.NodeGyp(rebuilder, testModulePath);
return nodeGyp.buildArgs([]);
}
context('sufficiently old Electron versions which lack a bundled config.gypi', () => {
it('adds --force-process-config for < 14', async () => {
const args = await nodeGypArgsForElectronVersion('12.0.0');
(0, chai_1.expect)(args).to.include('--force-process-config');
});
it('adds --force-process-config for between 14.0.0 and < 14.2.0', async () => {
const args = await nodeGypArgsForElectronVersion('14.1.0');
(0, chai_1.expect)(args).to.include('--force-process-config');
});
it('adds --force-process-config for versions between 15.0.0 and < 15.3.0', async () => {
const args = await nodeGypArgsForElectronVersion('15.2.0');
(0, chai_1.expect)(args).to.include('--force-process-config');
});
});
context('for sufficiently new Electron versions', () => {
it('does not add --force-process-config for ^14.2.0', async () => {
const args = await nodeGypArgsForElectronVersion('14.2.0');
(0, chai_1.expect)(args).to.not.include('--force-process-config');
});
it('does not add --force-process-config for ^15.3.0', async () => {
const args = await nodeGypArgsForElectronVersion('15.3.0');
(0, chai_1.expect)(args).to.not.include('--force-process-config');
});
it('does not add --force-process-config for >= 16.0.0', async () => {
const args = await nodeGypArgsForElectronVersion('16.0.0-alpha.1');
(0, chai_1.expect)(args).to.not.include('--force-process-config');
});
});
});
});
//# sourceMappingURL=module-type-node-gyp.js.map

View File

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

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,82 @@
"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 chai_1 = __importStar(require("chai"));
const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
const events_1 = require("events");
const os_1 = __importDefault(require("os"));
const path_1 = __importDefault(require("path"));
const module_setup_1 = require("./helpers/module-setup");
const prebuild_install_1 = require("../src/module-type/prebuild-install");
const rebuild_1 = require("../src/rebuild");
chai_1.default.use(chai_as_promised_1.default);
const testModulePath = path_1.default.resolve(os_1.default.tmpdir(), 'electron-rebuild-test');
describe('prebuild-install', () => {
const modulePath = path_1.default.join(testModulePath, 'node_modules', 'farmhash');
const rebuilderArgs = {
buildPath: testModulePath,
electronVersion: '8.0.0',
arch: process.arch,
lifecycle: new events_1.EventEmitter()
};
before(() => {
process.env.ELECTRON_REBUILD_TESTS = 'true';
});
describe('Node-API support', function () {
this.timeout(module_setup_1.TIMEOUT_IN_MILLISECONDS);
before(async () => await (0, module_setup_1.resetTestModule)(testModulePath));
after(async () => await (0, module_setup_1.cleanupTestModule)(testModulePath));
it('should find correct napi version and select napi args', async () => {
const rebuilder = new rebuild_1.Rebuilder(rebuilderArgs);
const prebuildInstall = new prebuild_install_1.PrebuildInstall(rebuilder, modulePath);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
(0, chai_1.expect)(prebuildInstall.nodeAPI.getNapiVersion((await prebuildInstall.getSupportedNapiVersions()))).to.equal(3);
(0, chai_1.expect)(await prebuildInstall.getPrebuildInstallRuntimeArgs()).to.deep.equal([
'--runtime=napi',
`--target=3`,
]);
});
it('should not fail running prebuild-install', async () => {
const rebuilder = new rebuild_1.Rebuilder(rebuilderArgs);
const prebuildInstall = new prebuild_install_1.PrebuildInstall(rebuilder, modulePath);
(0, chai_1.expect)(await prebuildInstall.findPrebuiltModule()).to.equal(true);
});
it('should throw error with unsupported Electron version', async () => {
const rebuilder = new rebuild_1.Rebuilder({
...rebuilderArgs,
electronVersion: '2.0.0',
});
const prebuildInstall = new prebuild_install_1.PrebuildInstall(rebuilder, modulePath);
(0, chai_1.expect)(prebuildInstall.findPrebuiltModule()).to.eventually.be.rejectedWith("Native module 'farmhash' requires Node-API but Electron v2.0.0 does not support Node-API");
});
});
after(() => {
delete process.env.ELECTRON_REBUILD_TESTS;
});
});
//# sourceMappingURL=module-type-prebuild-install.js.map

View File

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

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,102 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const events_1 = require("events");
const chai_1 = require("chai");
const path_1 = __importDefault(require("path"));
const prebuildify_1 = require("../src/module-type/prebuildify");
const rebuild_1 = require("../src/rebuild");
describe('determineNativePrebuildArch', () => {
it('returns arm if passed in armv7l', () => {
(0, chai_1.expect)((0, prebuildify_1.determineNativePrebuildArch)('armv7l')).to.equal('arm');
});
it('returns the input arch if the input is not armv7l', () => {
(0, chai_1.expect)((0, prebuildify_1.determineNativePrebuildArch)('x64')).to.equal('x64');
});
});
describe('determineNativePrebuildExtension', () => {
it('returns armv8 suffix for an arm64 arch', () => {
(0, chai_1.expect)((0, prebuildify_1.determineNativePrebuildExtension)('arm64')).to.equal('armv8.node');
});
it('returns armv7 suffix for an armv7l arch', () => {
(0, chai_1.expect)((0, prebuildify_1.determineNativePrebuildExtension)('armv7l')).to.equal('armv7.node');
});
it('returns no suffix for non-ARM arches', () => {
(0, chai_1.expect)((0, prebuildify_1.determineNativePrebuildExtension)('x64')).to.equal('node');
});
});
describe('prebuildify', () => {
const fixtureBaseDir = path_1.default.join(__dirname, 'fixture', 'prebuildify');
const rebuilderArgs = {
buildPath: 'nonexistent-path',
electronVersion: '13.0.0',
arch: 'x64',
lifecycle: new events_1.EventEmitter()
};
const createRebuilder = (args = {}) => {
const rebuilder = new rebuild_1.Rebuilder({ ...rebuilderArgs, ...args });
rebuilder.platform = 'linux';
return rebuilder;
};
describe('usesTool', () => {
it('succeeds if prebuildify exists in devDependencies', async () => {
const rebuilder = createRebuilder();
const prebuildify = new prebuildify_1.Prebuildify(rebuilder, path_1.default.join(fixtureBaseDir, 'has-prebuildify-devdep'));
(0, chai_1.expect)(await prebuildify.usesTool()).to.equal(true);
});
it('fails if prebuildify does not exist in devDependencies', async () => {
const rebuilder = createRebuilder();
const prebuildify = new prebuildify_1.Prebuildify(rebuilder, path_1.default.join(fixtureBaseDir, 'no-prebuildify-devdep'));
(0, chai_1.expect)(await prebuildify.usesTool()).to.equal(false);
});
});
describe('findPrebuiltModule', () => {
describe('with no prebuilds directory', () => {
it('should not find a prebuilt native module', async () => {
const noPrebuildsDir = __dirname;
const rebuilder = createRebuilder();
const prebuildify = new prebuildify_1.Prebuildify(rebuilder, noPrebuildsDir);
(0, chai_1.expect)(await prebuildify.findPrebuiltModule()).to.equal(false);
});
});
describe('with prebuilt module for the given ABI', async () => {
it('should find a prebuilt native module for x64/electron', async () => {
const fixtureDir = path_1.default.join(fixtureBaseDir, 'abi');
const rebuilder = createRebuilder();
const prebuildify = new prebuildify_1.Prebuildify(rebuilder, fixtureDir);
(0, chai_1.expect)(await prebuildify.findPrebuiltModule()).to.equal(true);
});
});
describe('with prebuilt Node-API module', async () => {
it('should find a prebuilt native module for x64/node', async () => {
const fixtureDir = path_1.default.join(fixtureBaseDir, 'napi');
const rebuilder = createRebuilder();
const prebuildify = new prebuildify_1.Prebuildify(rebuilder, fixtureDir);
(0, chai_1.expect)(await prebuildify.findPrebuiltModule()).to.equal(true);
});
it('should find a prebuilt native module for armv7l/node', async () => {
const fixtureDir = path_1.default.join(fixtureBaseDir, 'napi');
const rebuilder = createRebuilder({ arch: 'armv7l' });
const prebuildify = new prebuildify_1.Prebuildify(rebuilder, fixtureDir);
(0, chai_1.expect)(await prebuildify.findPrebuiltModule()).to.equal(true);
});
it('should find a prebuilt native module for arm64/electron', async () => {
const fixtureDir = path_1.default.join(fixtureBaseDir, 'napi');
const rebuilder = createRebuilder({ arch: 'arm64' });
const prebuildify = new prebuildify_1.Prebuildify(rebuilder, fixtureDir);
(0, chai_1.expect)(await prebuildify.findPrebuiltModule()).to.equal(true);
});
});
describe('when it cannot find a prebuilt module', async () => {
it('should not find a prebuilt native module', async () => {
const fixtureDir = path_1.default.join(fixtureBaseDir, 'not-found');
const rebuilder = createRebuilder();
const prebuildify = new prebuildify_1.Prebuildify(rebuilder, fixtureDir);
(0, chai_1.expect)(await prebuildify.findPrebuiltModule()).to.equal(false);
});
});
});
});
//# sourceMappingURL=module-type-prebuildify.js.map

View File

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

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,35 @@
"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 });
const path = __importStar(require("path"));
const chai_1 = require("chai");
const read_package_json_1 = require("../src/read-package-json");
describe('read-package-json', () => {
it('should find a package.json file from the given directory', async () => {
// eslint-disable-next-line @typescript-eslint/no-var-requires
(0, chai_1.expect)(await (0, read_package_json_1.readPackageJson)(path.resolve(__dirname, '..'))).to.deep.equal(require('../package.json'));
});
});
//# sourceMappingURL=read-package-json.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"read-package-json.js","sourceRoot":"","sources":["../../test/read-package-json.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,+BAA8B;AAE9B,gEAA2D;AAE3D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,8DAA8D;QAC9D,IAAA,aAAM,EAAC,MAAM,IAAA,mCAAe,EAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACzG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,69 @@
"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 });
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
const os = __importStar(require("os"));
const cross_spawn_promise_1 = require("@malept/cross-spawn-promise");
const rebuild_1 = require("./helpers/rebuild");
const electron_version_1 = require("./helpers/electron-version");
const search_module_1 = require("../src/search-module");
const rebuild_2 = require("../src/rebuild");
const testElectronVersion = (0, electron_version_1.getExactElectronVersionSync)();
describe('rebuild for yarn workspace', function () {
this.timeout(2 * 60 * 1000);
const testModulePath = path.resolve(os.tmpdir(), 'electron-rebuild-test');
const msvs_version = process.env.GYP_MSVS_VERSION;
describe('core behavior', () => {
before(async () => {
await fs.remove(testModulePath);
await fs.copy(path.resolve(__dirname, 'fixture/workspace-test'), testModulePath);
await (0, cross_spawn_promise_1.spawn)('yarn', [], { cwd: testModulePath });
if (msvs_version) {
process.env.GYP_MSVS_VERSION = msvs_version;
}
const projectRootPath = await (0, search_module_1.getProjectRootPath)(path.join(testModulePath, 'workspace-test', 'child-workspace'));
await (0, rebuild_2.rebuild)({
buildPath: path.resolve(testModulePath, 'child-workspace'),
electronVersion: testElectronVersion,
arch: process.arch,
projectRootPath
});
});
it('should have rebuilt top level prod dependencies', async () => {
await (0, rebuild_1.expectNativeModuleToBeRebuilt)(testModulePath, 'snappy');
});
it('should not have rebuilt top level devDependencies', async () => {
await (0, rebuild_1.expectNativeModuleToNotBeRebuilt)(testModulePath, 'sleep');
});
after(async () => {
await fs.remove(testModulePath);
if (msvs_version) {
process.env.GYP_MSVS_VERSION = msvs_version;
}
});
});
});
//# sourceMappingURL=rebuild-yarnworkspace.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"rebuild-yarnworkspace.js","sourceRoot":"","sources":["../../test/rebuild-yarnworkspace.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAC/B,2CAA6B;AAC7B,uCAAyB;AACzB,qEAAoD;AAEpD,+CAAoG;AACpG,iEAAyE;AACzE,wDAA0D;AAC1D,4CAAyC;AAEzC,MAAM,mBAAmB,GAAG,IAAA,8CAA2B,GAAE,CAAC;AAE1D,QAAQ,CAAC,4BAA4B,EAAE;IACrC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAuB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAEtE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,KAAK,IAAI,EAAE;YAChB,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAChC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,wBAAwB,CAAC,EAAE,cAAc,CAAC,CAAC;YAEjF,MAAM,IAAA,2BAAK,EAAC,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC;YACjD,IAAI,YAAY,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,YAAY,CAAC;aAC7C;YAED,MAAM,eAAe,GAAG,MAAM,IAAA,kCAAkB,EAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC,CAAC;YAEjH,MAAM,IAAA,iBAAO,EAAC;gBACZ,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,iBAAiB,CAAC;gBAC1D,eAAe,EAAE,mBAAmB;gBACpC,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,eAAe;aAChB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,IAAA,uCAA6B,EAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,IAAA,0CAAgC,EAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAChC,IAAI,YAAY,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,YAAY,CAAC;aAC7C;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,192 @@
"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 });
const chai_1 = require("chai");
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
const os = __importStar(require("os"));
const module_setup_1 = require("./helpers/module-setup");
const rebuild_1 = require("./helpers/rebuild");
const electron_version_1 = require("./helpers/electron-version");
const rebuild_2 = require("../src/rebuild");
const testElectronVersion = (0, electron_version_1.getExactElectronVersionSync)();
describe('rebuilder', () => {
const testModulePath = path.resolve(os.tmpdir(), 'electron-rebuild-test');
describe('core behavior', function () {
this.timeout(module_setup_1.TIMEOUT_IN_MILLISECONDS);
before(async () => {
await (0, module_setup_1.resetTestModule)(testModulePath);
process.env.ELECTRON_REBUILD_TESTS = 'true';
await (0, rebuild_2.rebuild)({
buildPath: testModulePath,
electronVersion: testElectronVersion,
arch: process.arch
});
});
it('should have rebuilt top level prod dependencies', async () => {
await (0, rebuild_1.expectNativeModuleToBeRebuilt)(testModulePath, 'ref-napi');
});
it('should have rebuilt top level prod dependencies that are using prebuild', async () => {
await (0, rebuild_1.expectNativeModuleToBeRebuilt)(testModulePath, 'farmhash');
});
it('should have rebuilt children of top level prod dependencies', async () => {
await (0, rebuild_1.expectNativeModuleToBeRebuilt)(testModulePath, 'leveldown');
});
it('should have rebuilt children of scoped top level prod dependencies', async () => {
await (0, rebuild_1.expectNativeModuleToBeRebuilt)(testModulePath, '@newrelic/native-metrics');
});
it('should have rebuilt top level optional dependencies', async () => {
await (0, rebuild_1.expectNativeModuleToBeRebuilt)(testModulePath, 'bcrypt');
});
it('should not have rebuilt top level devDependencies', async () => {
await (0, rebuild_1.expectNativeModuleToNotBeRebuilt)(testModulePath, 'ffi-napi');
});
it('should not download files in the module directory', async () => {
const modulePath = path.resolve(testModulePath, 'node_modules/ref-napi');
const fileNames = await fs.readdir(modulePath);
(0, chai_1.expect)(fileNames).to.not.contain(testElectronVersion);
});
after(async () => {
delete process.env.ELECTRON_REBUILD_TESTS;
await (0, module_setup_1.cleanupTestModule)(testModulePath);
});
});
describe('force rebuild', function () {
this.timeout(module_setup_1.TIMEOUT_IN_MILLISECONDS);
before(async () => await (0, module_setup_1.resetTestModule)(testModulePath));
after(async () => await (0, module_setup_1.cleanupTestModule)(testModulePath));
afterEach(module_setup_1.resetMSVSVersion);
const buildPath = testModulePath;
const electronVersion = testElectronVersion;
const arch = process.arch;
const extraModules = [];
it('should skip the rebuild step when disabled', async () => {
await (0, rebuild_2.rebuild)({ buildPath, electronVersion, arch });
(0, module_setup_1.resetMSVSVersion)();
const rebuilder = (0, rebuild_2.rebuild)({ buildPath, electronVersion, arch, extraModules, force: false });
let skipped = 0;
rebuilder.lifecycle.on('module-skip', () => {
skipped++;
});
await rebuilder;
(0, chai_1.expect)(skipped).to.equal(6);
});
it('should rebuild all modules again when disabled but the electron ABI changed', async () => {
await (0, rebuild_2.rebuild)({ buildPath, electronVersion, arch });
(0, module_setup_1.resetMSVSVersion)();
const rebuilder = (0, rebuild_2.rebuild)({ buildPath, electronVersion: '3.0.0', arch, extraModules, force: false });
let skipped = 0;
rebuilder.lifecycle.on('module-skip', () => {
skipped++;
});
await rebuilder;
(0, chai_1.expect)(skipped).to.equal(0);
});
it('should rebuild all modules again when enabled', async function () {
if (process.platform === 'darwin') {
this.timeout(5 * module_setup_1.MINUTES_IN_MILLISECONDS);
}
await (0, rebuild_2.rebuild)({ buildPath, electronVersion, arch });
(0, module_setup_1.resetMSVSVersion)();
const rebuilder = (0, rebuild_2.rebuild)({ buildPath, electronVersion, arch, extraModules, force: true });
let skipped = 0;
rebuilder.lifecycle.on('module-skip', () => {
skipped++;
});
await rebuilder;
(0, chai_1.expect)(skipped).to.equal(0);
});
});
describe('only rebuild', function () {
this.timeout(2 * module_setup_1.MINUTES_IN_MILLISECONDS);
beforeEach(async () => await (0, module_setup_1.resetTestModule)(testModulePath));
afterEach(async () => await (0, module_setup_1.cleanupTestModule)(testModulePath));
it('should rebuild only specified modules', async () => {
const nativeModuleBinary = path.join(testModulePath, 'node_modules', 'native-hello-world', 'build', 'Release', 'hello_world.node');
(0, chai_1.expect)(await fs.pathExists(nativeModuleBinary)).to.be.true;
await fs.remove(nativeModuleBinary);
(0, chai_1.expect)(await fs.pathExists(nativeModuleBinary)).to.be.false;
const rebuilder = (0, rebuild_2.rebuild)({
buildPath: testModulePath,
electronVersion: testElectronVersion,
arch: process.arch,
onlyModules: ['native-hello-world'],
force: true
});
let built = 0;
rebuilder.lifecycle.on('module-done', () => built++);
await rebuilder;
(0, chai_1.expect)(built).to.equal(1);
(0, chai_1.expect)(await fs.pathExists(nativeModuleBinary)).to.be.true;
});
it('should rebuild multiple specified modules via --only option', async () => {
const rebuilder = (0, rebuild_2.rebuild)({
buildPath: testModulePath,
electronVersion: testElectronVersion,
arch: process.arch,
onlyModules: ['ffi-napi', 'ref-napi'],
force: true
});
let built = 0;
rebuilder.lifecycle.on('module-done', () => built++);
await rebuilder;
(0, chai_1.expect)(built).to.equal(2);
});
});
describe('debug rebuild', function () {
this.timeout(10 * module_setup_1.MINUTES_IN_MILLISECONDS);
before(async () => await (0, module_setup_1.resetTestModule)(testModulePath));
after(async () => await (0, module_setup_1.cleanupTestModule)(testModulePath));
it('should have rebuilt ffi-napi module in Debug mode', async () => {
await (0, rebuild_2.rebuild)({
buildPath: testModulePath,
electronVersion: testElectronVersion,
arch: process.arch,
onlyModules: ['ffi-napi'],
force: true,
debug: true
});
await (0, rebuild_1.expectNativeModuleToBeRebuilt)(testModulePath, 'ffi-napi', { buildType: 'Debug' });
await (0, rebuild_1.expectNativeModuleToNotBeRebuilt)(testModulePath, 'ffi-napi');
});
});
describe('useElectronClang rebuild', function () {
this.timeout(10 * module_setup_1.MINUTES_IN_MILLISECONDS);
before(async () => await (0, module_setup_1.resetTestModule)(testModulePath));
after(async () => await (0, module_setup_1.cleanupTestModule)(testModulePath));
it('should have rebuilt ffi-napi module using clang mode', async () => {
await (0, rebuild_2.rebuild)({
buildPath: testModulePath,
electronVersion: testElectronVersion,
arch: process.arch,
onlyModules: ['ffi-napi'],
force: true,
useElectronClang: true
});
await (0, rebuild_1.expectNativeModuleToBeRebuilt)(testModulePath, 'ffi-napi');
});
});
});
//# sourceMappingURL=rebuild.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,65 @@
"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 });
const chai_1 = require("chai");
const fs = __importStar(require("fs-extra"));
const os = __importStar(require("os"));
const path = __importStar(require("path"));
const search_module_1 = require("../src/search-module");
let baseDir;
async function createTempDir() {
baseDir = await fs.mkdtemp(path.join(os.tmpdir(), 'electron-rebuild-test-'));
}
async function removeTempDir() {
await fs.remove(baseDir);
}
describe('search-module', () => {
describe('getProjectRootPath', () => {
describe('multi-level workspace', () => {
for (const lockFile of ['yarn.lock', 'package-lock.json']) {
describe(lockFile, () => {
before(async () => {
await createTempDir();
await fs.copy(path.resolve(__dirname, 'fixture', 'multi-level-workspace'), baseDir);
await fs.ensureFile(path.join(baseDir, lockFile));
});
it('finds the folder with the lockfile', async () => {
const packageDir = path.join(baseDir, 'packages', 'bar');
(0, chai_1.expect)(await (0, search_module_1.getProjectRootPath)(packageDir)).to.equal(baseDir);
});
after(removeTempDir);
});
}
});
describe('no workspace', () => {
before(createTempDir);
it('returns the input directory if a lockfile cannot be found', async () => {
(0, chai_1.expect)(await (0, search_module_1.getProjectRootPath)(baseDir)).to.equal(baseDir);
});
after(removeTempDir);
});
});
});
//# sourceMappingURL=search-module.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"search-module.js","sourceRoot":"","sources":["../../test/search-module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+BAA8B;AAC9B,6CAA+B;AAC/B,uCAAyB;AACzB,2CAA6B;AAE7B,wDAA0D;AAE1D,IAAI,OAAe,CAAC;AAEpB,KAAK,UAAU,aAAa;IAC1B,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;YACrC,KAAK,MAAM,QAAQ,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,EAAE;gBACzD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;oBACtB,MAAM,CAAC,KAAK,IAAI,EAAE;wBAChB,MAAM,aAAa,EAAE,CAAC;wBACtB,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,uBAAuB,CAAC,EAAE,OAAO,CAAC,CAAC;wBACpF,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;oBACpD,CAAC,CAAC,CAAC;oBAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;wBAClD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;wBACzD,IAAA,aAAM,EAAC,MAAM,IAAA,kCAAkB,EAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACjE,CAAC,CAAC,CAAC;oBAEH,KAAK,CAAC,aAAa,CAAC,CAAC;gBACvB,CAAC,CAAC,CAAC;aACJ;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,aAAa,CAAC,CAAC;YAEtB,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;gBACzE,IAAA,aAAM,EAAC,MAAM,IAAA,kCAAkB,EAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,aAAa,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}

Some files were not shown because too many files have changed in this diff Show More