Delete 100 files via Git Manager GUI

This commit is contained in:
2026-10-22 09:13:46 +00:00
parent 56b5cb17d0
commit e154cc507e
100 changed files with 0 additions and 4383 deletions
-46
View File
@@ -1,46 +0,0 @@
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const args = require('minimist')(process.argv.slice(2), {
string: [
'signature-flags'
],
boolean: [
'help',
'pre-auto-entitlements',
'pre-embed-provisioning-profile',
'hardened-runtime',
'restrict'
],
default: {
'pre-auto-entitlements': true,
'pre-embed-provisioning-profile': true
}
});
const usage = fs.readFileSync(path.join(__dirname, 'electron-osx-sign-usage.txt')).toString();
const sign = require('../').sign;
args.app = args._.shift();
args.binaries = args._;
if (!args.app || args.help) {
console.log(usage);
process.exit(0);
}
// Remove excess arguments
delete args._;
delete args.help;
sign(args, function done (err) {
if (err) {
console.error('Sign failed:');
if (err.message) console.error(err.message);
else if (err.stack) console.error(err.stack);
else console.log(err);
process.exit(1);
}
console.log('Application signed:', args.app);
process.exit(0);
});
-15
View File
@@ -1,15 +0,0 @@
import { FlatOptions } from './types';
/**
* Generates a flat `.pkg` installer for a packaged Electron `.app` bundle.
* @returns A void Promise once the flattening operation is complete.
*
* @category Flat
*/
export declare function buildPkg(_opts: FlatOptions): Promise<void>;
/**
* This function is exported with normal callback implementation.
*
* @deprecated Please use the Promise-based {@link flatAsync} method instead.
* @category Flat
*/
export declare const flat: (opts: FlatOptions, cb?: ((error?: Error) => void) | undefined) => void;
-179
View File
@@ -1,179 +0,0 @@
"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.flat = exports.buildPkg = void 0;
const path = __importStar(require("path"));
const util_1 = require("./util");
const util_identities_1 = require("./util-identities");
const pkgVersion = require('../../package.json').version;
/**
* This function returns a promise validating all options passed in opts.
* @function
* @param {Object} opts - Options.
* @returns {Promise} Promise.
*/
async function validateFlatOpts(opts) {
await (0, util_1.validateOptsApp)(opts);
let pkg = opts.pkg;
if (pkg) {
if (typeof pkg !== 'string')
throw new Error('`pkg` must be a string.');
if (path.extname(pkg) !== '.pkg') {
throw new Error('Extension of output package must be `.pkg`.');
}
}
else {
(0, util_1.debugWarn)('No `pkg` passed in arguments, will fallback to default inferred from the given application.');
pkg = path.join(path.dirname(opts.app), path.basename(opts.app, '.app') + '.pkg');
}
let install = opts.install;
if (install) {
if (typeof install !== 'string') {
return Promise.reject(new Error('`install` must be a string.'));
}
}
else {
(0, util_1.debugWarn)('No `install` passed in arguments, will fallback to default `/Applications`.');
install = '/Applications';
}
if (typeof opts.scripts === 'string' && opts.platform === 'mas') {
(0, util_1.debugWarn)('Mac App Store packages cannot have `scripts`, ignoring option.');
}
return Object.assign(Object.assign({}, opts), { pkg,
install, platform: await (0, util_1.validateOptsPlatform)(opts) });
}
/**
* This function returns a promise flattening the application.
* @param opts - Options for building the .pkg archive
*/
async function buildApplicationPkg(opts, identity) {
if (opts.platform === 'mas') {
const args = ['--component', opts.app, opts.install, '--sign', identity.name, opts.pkg];
if (opts.keychain) {
args.unshift('--keychain', opts.keychain);
}
(0, util_1.debugLog)('Flattening Mac App Store package... ' + opts.app);
await (0, util_1.execFileAsync)('productbuild', args);
}
else {
const componentPkgPath = path.join(path.dirname(opts.app), path.basename(opts.app, '.app') + '-component.pkg');
const pkgbuildArgs = [
'--install-location',
opts.install,
'--component',
opts.app,
componentPkgPath
];
if (opts.scripts) {
pkgbuildArgs.unshift('--scripts', opts.scripts);
}
(0, util_1.debugLog)('Building component package... ' + opts.app);
await (0, util_1.execFileAsync)('pkgbuild', pkgbuildArgs);
const args = ['--package', componentPkgPath, opts.install, '--sign', identity.name, opts.pkg];
if (opts.keychain) {
args.unshift('--keychain', opts.keychain);
}
(0, util_1.debugLog)('Flattening OS X Installer package... ' + opts.app);
await (0, util_1.execFileAsync)('productbuild', args);
await (0, util_1.execFileAsync)('rm', [componentPkgPath]);
}
}
/**
* Generates a flat `.pkg` installer for a packaged Electron `.app` bundle.
* @returns A void Promise once the flattening operation is complete.
*
* @category Flat
*/
async function buildPkg(_opts) {
(0, util_1.debugLog)('@electron/osx-sign@%s', pkgVersion);
const validatedOptions = await validateFlatOpts(_opts);
let identities = [];
let identityInUse = null;
if (validatedOptions.identity) {
(0, util_1.debugLog)('`identity` passed in arguments.');
if (validatedOptions.identityValidation === false) {
// Do nothing
}
else {
identities = await (0, util_identities_1.findIdentities)(validatedOptions.keychain || null, validatedOptions.identity);
}
}
else {
(0, util_1.debugWarn)('No `identity` passed in arguments...');
if (validatedOptions.platform === 'mas') {
(0, util_1.debugLog)('Finding `3rd Party Mac Developer Installer` certificate for flattening app distribution in the Mac App Store...');
identities = await (0, util_identities_1.findIdentities)(validatedOptions.keychain || null, '3rd Party Mac Developer Installer:');
}
else {
(0, util_1.debugLog)('Finding `Developer ID Application` certificate for distribution outside the Mac App Store...');
identities = await (0, util_identities_1.findIdentities)(validatedOptions.keychain || null, 'Developer ID Installer:');
}
}
if (identities.length > 0) {
// Provisioning profile(s) found
if (identities.length > 1) {
(0, util_1.debugWarn)('Multiple identities found, will use the first discovered.');
}
else {
(0, util_1.debugLog)('Found 1 identity.');
}
identityInUse = identities[0];
}
else {
// No identity found
throw new Error('No identity found for signing.');
}
(0, util_1.debugLog)('Flattening application...', '\n', '> Application:', validatedOptions.app, '\n', '> Package output:', validatedOptions.pkg, '\n', '> Install path:', validatedOptions.install, '\n', '> Identity:', validatedOptions.identity, '\n', '> Scripts:', validatedOptions.scripts);
await buildApplicationPkg(validatedOptions, identityInUse);
(0, util_1.debugLog)('Application flattened.');
}
exports.buildPkg = buildPkg;
/**
* This function is exported with normal callback implementation.
*
* @deprecated Please use the Promise-based {@link flatAsync} method instead.
* @category Flat
*/
const flat = (opts, cb) => {
buildPkg(opts)
.then(() => {
(0, util_1.debugLog)('Application flattened, saved to: ' + opts.app);
if (cb)
cb();
})
.catch((err) => {
(0, util_1.debugLog)('Flat failed:');
if (err.message)
(0, util_1.debugLog)(err.message);
else if (err.stack)
(0, util_1.debugLog)(err.stack);
else
(0, util_1.debugLog)(err);
if (cb)
cb(err);
});
};
exports.flat = flat;
//# sourceMappingURL=flat.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"flat.js","sourceRoot":"","sources":["../../src/flat.ts"],"names":[],"mappings":"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"}
-5
View File
@@ -1,5 +0,0 @@
import { sign, signApp } from './sign';
import { flat, buildPkg } from './flat';
import { walkAsync } from './util';
export { sign, flat, signApp as signAsync, signApp, buildPkg as flatAsync, buildPkg, walkAsync };
export * from './types';
-39
View File
@@ -1,39 +0,0 @@
"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 __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.walkAsync = exports.buildPkg = exports.flatAsync = exports.signApp = exports.signAsync = exports.flat = exports.sign = void 0;
const sign_1 = require("./sign");
Object.defineProperty(exports, "sign", { enumerable: true, get: function () { return sign_1.sign; } });
Object.defineProperty(exports, "signAsync", { enumerable: true, get: function () { return sign_1.signApp; } });
Object.defineProperty(exports, "signApp", { enumerable: true, get: function () { return sign_1.signApp; } });
const flat_1 = require("./flat");
Object.defineProperty(exports, "flat", { enumerable: true, get: function () { return flat_1.flat; } });
Object.defineProperty(exports, "flatAsync", { enumerable: true, get: function () { return flat_1.buildPkg; } });
Object.defineProperty(exports, "buildPkg", { enumerable: true, get: function () { return flat_1.buildPkg; } });
const util_1 = require("./util");
Object.defineProperty(exports, "walkAsync", { enumerable: true, get: function () { return util_1.walkAsync; } });
// TODO: Remove and leave only proper named exports, but for non-breaking change reasons
// we need to keep this weirdness for now
module.exports = sign_1.sign;
module.exports.sign = sign_1.sign;
module.exports.signAsync = sign_1.signApp;
module.exports.signApp = sign_1.signApp;
module.exports.flat = flat_1.flat;
module.exports.flatAsync = flat_1.buildPkg;
module.exports.buildPkg = flat_1.buildPkg;
module.exports.walkAsync = util_1.walkAsync;
__exportStar(require("./types"), exports);
//# sourceMappingURL=index.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iCAAuC;AAe9B,qFAfA,WAAI,OAeA;AAAmB,0FAfjB,cAAO,OAemB;AAAE,wFAf5B,cAAO,OAe4B;AAdlD,iCAAwC;AAczB,qFAdN,WAAI,OAcM;AAA6C,0FAdjD,eAAQ,OAckD;AAAE,yFAd5D,eAAQ,OAc4D;AAbnF,iCAAmC;AAakD,0FAb5E,gBAAS,OAa4E;AAX9F,wFAAwF;AACxF,yCAAyC;AACzC,MAAM,CAAC,OAAO,GAAG,WAAI,CAAC;AACtB,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,WAAI,CAAC;AAC3B,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,cAAO,CAAC;AACnC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,cAAO,CAAC;AACjC,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,WAAI,CAAC;AAC3B,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,eAAQ,CAAC;AACpC,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,eAAQ,CAAC;AACnC,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,gBAAS,CAAC;AAGrC,0CAAwB"}
-15
View File
@@ -1,15 +0,0 @@
import { SignOptions } from './types';
/**
* Signs a macOS application.
* @returns A void Promise once the signing operation is complete.
*
* @category Codesign
*/
export declare function signApp(_opts: SignOptions): Promise<void>;
/**
* This function is a legacy callback implementation.
*
* @deprecated Please use the Promise-based {@link signAsync} method instead.
* @category Codesign
*/
export declare const sign: (opts: SignOptions, cb?: ((error?: Error) => void) | undefined) => void;
-377
View File
@@ -1,377 +0,0 @@
"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.sign = exports.signApp = void 0;
const fs = __importStar(require("fs-extra"));
const os = __importStar(require("os"));
const path = __importStar(require("path"));
const plist = __importStar(require("plist"));
const compare_version_1 = __importDefault(require("compare-version"));
const util_1 = require("./util");
const util_identities_1 = require("./util-identities");
const util_provisioning_profiles_1 = require("./util-provisioning-profiles");
const util_entitlements_1 = require("./util-entitlements");
const pkgVersion = require('../../package.json').version;
const osRelease = os.release();
/**
* This function returns a promise validating opts.binaries, the additional binaries to be signed along with the discovered enclosed components.
*/
async function validateOptsBinaries(opts) {
if (opts.binaries) {
if (!Array.isArray(opts.binaries)) {
throw new Error('Additional binaries should be an Array.');
}
// TODO: Presence check for binary files, reject if any does not exist
}
}
function validateOptsIgnore(ignore) {
if (ignore && !(ignore instanceof Array)) {
return [ignore];
}
}
/**
* This function returns a promise validating all options passed in opts.
*/
async function validateSignOpts(opts) {
await validateOptsBinaries(opts);
await (0, util_1.validateOptsApp)(opts);
if (opts.provisioningProfile && typeof opts.provisioningProfile !== 'string') {
throw new Error('Path to provisioning profile should be a string.');
}
if (opts.type && opts.type !== 'development' && opts.type !== 'distribution') {
throw new Error('Type must be either `development` or `distribution`.');
}
const platform = await (0, util_1.validateOptsPlatform)(opts);
const cloned = Object.assign(Object.assign({}, opts), { ignore: validateOptsIgnore(opts.ignore), type: opts.type || 'distribution', platform });
return cloned;
}
/**
* This function returns a promise verifying the code sign of application bundle.
*/
async function verifySignApplication(opts) {
// Verify with codesign
(0, util_1.debugLog)('Verifying application bundle with codesign...');
const strictVerify = opts.strictVerify !== undefined ? opts.strictVerify : true;
await (0, util_1.execFileAsync)('codesign', ['--verify', '--deep'].concat(strictVerify !== false && (0, compare_version_1.default)(osRelease, '15.0.0') >= 0 // Strict flag since darwin 15.0.0 --> OS X 10.11.0 El Capitan
? [
'--strict' +
(strictVerify !== true ? '=' + strictVerify : '')
]
: [], ['--verbose=2', opts.app]));
}
function defaultOptionsForFile(filePath, platform) {
const entitlementsFolder = path.resolve(__dirname, '..', '..', 'entitlements');
let entitlementsFile;
if (platform === 'darwin') {
// Default Entitlements
// c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/app-entitlements.plist
// Also include JIT for main process V8
entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.plist');
// Plugin helper
// c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/helper-plugin-entitlements.plist
if (filePath.includes('(Plugin).app')) {
entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.plugin.plist');
// GPU Helper
// c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/helper-gpu-entitlements.plist
}
else if (filePath.includes('(GPU).app')) {
entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.gpu.plist');
// Renderer Helper
// c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/helper-renderer-entitlements.plist
}
else if (filePath.includes('(Renderer).app')) {
entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.renderer.plist');
}
}
else {
// Default entitlements
// TODO: Can these be more scoped like the non-mas variant?
entitlementsFile = path.resolve(entitlementsFolder, 'default.mas.plist');
// If it is not the top level app bundle, we sign with inherit
if (filePath.includes('.app/')) {
entitlementsFile = path.resolve(entitlementsFolder, 'default.mas.child.plist');
}
}
return {
entitlements: entitlementsFile,
hardenedRuntime: true,
requirements: undefined,
signatureFlags: undefined,
timestamp: undefined,
additionalArguments: []
};
}
async function mergeOptionsForFile(opts, defaults) {
const mergedPerFileOptions = Object.assign({}, defaults);
if (opts) {
if (opts.entitlements !== undefined) {
if (Array.isArray(opts.entitlements)) {
const entitlements = opts.entitlements.reduce((dict, entitlementKey) => (Object.assign(Object.assign({}, dict), { [entitlementKey]: true })), {});
const dir = await fs.mkdtemp(path.resolve(os.tmpdir(), 'tmp-entitlements-'));
const entitlementsPath = path.join(dir, 'entitlements.plist');
await fs.writeFile(entitlementsPath, plist.build(entitlements), 'utf8');
opts.entitlements = entitlementsPath;
}
mergedPerFileOptions.entitlements = opts.entitlements;
}
if (opts.hardenedRuntime !== undefined) {
mergedPerFileOptions.hardenedRuntime = opts.hardenedRuntime;
}
if (opts.requirements !== undefined)
mergedPerFileOptions.requirements = opts.requirements;
if (opts.signatureFlags !== undefined) {
mergedPerFileOptions.signatureFlags = opts.signatureFlags;
}
if (opts.timestamp !== undefined)
mergedPerFileOptions.timestamp = opts.timestamp;
if (opts.additionalArguments !== undefined)
mergedPerFileOptions.additionalArguments = opts.additionalArguments;
}
return mergedPerFileOptions;
}
/**
* This function returns a promise codesigning only.
*/
async function signApplication(opts, identity) {
function shouldIgnoreFilePath(filePath) {
if (opts.ignore) {
return opts.ignore.some(function (ignore) {
if (typeof ignore === 'function') {
return ignore(filePath);
}
return filePath.match(ignore);
});
}
return false;
}
const children = await (0, util_1.walkAsync)((0, util_1.getAppContentsPath)(opts));
if (opts.binaries)
children.push(...opts.binaries);
const args = ['--sign', identity.hash || identity.name, '--force'];
if (opts.keychain) {
args.push('--keychain', opts.keychain);
}
/**
* Sort the child paths by how deep they are in the file tree. Some arcane apple
* logic expects the deeper files to be signed first otherwise strange errors get
* thrown our way
*/
children.sort((a, b) => {
const aDepth = a.split(path.sep).length;
const bDepth = b.split(path.sep).length;
return bDepth - aDepth;
});
for (const filePath of [...children, opts.app]) {
if (shouldIgnoreFilePath(filePath)) {
(0, util_1.debugLog)('Skipped... ' + filePath);
continue;
}
const perFileOptions = await mergeOptionsForFile(opts.optionsForFile ? opts.optionsForFile(filePath) : null, defaultOptionsForFile(filePath, opts.platform));
// preAutoEntitlements should only be applied to the top level app bundle.
// Applying it other files will cause the app to crash and be rejected by Apple.
if (!filePath.includes('.app/')) {
if (opts.preAutoEntitlements === false) {
(0, util_1.debugWarn)('Pre-sign operation disabled for entitlements automation.');
}
else {
(0, util_1.debugLog)('Pre-sign operation enabled for entitlements automation with versions >= `1.1.1`:', '\n', '* Disable by setting `pre-auto-entitlements` to `false`.');
if (!opts.version || (0, compare_version_1.default)(opts.version, '1.1.1') >= 0) {
// Enable Mac App Store sandboxing without using temporary-exception, introduced in Electron v1.1.1. Relates to electron#5601
const newEntitlements = await (0, util_entitlements_1.preAutoEntitlements)(opts, perFileOptions, {
identity,
provisioningProfile: opts.provisioningProfile
? await (0, util_provisioning_profiles_1.getProvisioningProfile)(opts.provisioningProfile, opts.keychain)
: undefined
});
// preAutoEntitlements may provide us new entitlements, if so we update our options
// and ensure that entitlements-loginhelper has a correct default value
if (newEntitlements) {
perFileOptions.entitlements = newEntitlements;
}
}
}
}
(0, util_1.debugLog)('Signing... ' + filePath);
const perFileArgs = [...args];
if (perFileOptions.requirements) {
if (perFileOptions.requirements.charAt(0) === '=') {
perFileArgs.push(`-r${perFileOptions.requirements}`);
}
else {
perFileArgs.push('--requirements', perFileOptions.requirements);
}
}
if (perFileOptions.timestamp) {
perFileArgs.push('--timestamp=' + perFileOptions.timestamp);
}
else {
perFileArgs.push('--timestamp');
}
let optionsArguments = [];
if (perFileOptions.signatureFlags) {
if (Array.isArray(perFileOptions.signatureFlags)) {
optionsArguments.push(...perFileOptions.signatureFlags);
}
else {
const flags = perFileOptions.signatureFlags.split(',').map(function (flag) {
return flag.trim();
});
optionsArguments.push(...flags);
}
}
if (perFileOptions.hardenedRuntime || optionsArguments.includes('runtime')) {
// Hardened runtime since darwin 17.7.0 --> macOS 10.13.6
if ((0, compare_version_1.default)(osRelease, '17.7.0') >= 0) {
optionsArguments.push('runtime');
}
else {
// Remove runtime if passed in with --signature-flags
(0, util_1.debugLog)('Not enabling hardened runtime, current macOS version too low, requires 10.13.6 and higher');
optionsArguments = optionsArguments.filter((arg) => {
return arg !== 'runtime';
});
}
}
if (optionsArguments.length) {
perFileArgs.push('--options', [...new Set(optionsArguments)].join(','));
}
if (perFileOptions.additionalArguments) {
perFileArgs.push(...perFileOptions.additionalArguments);
}
await (0, util_1.execFileAsync)('codesign', perFileArgs.concat('--entitlements', perFileOptions.entitlements, filePath));
}
// Verify code sign
(0, util_1.debugLog)('Verifying...');
await verifySignApplication(opts);
(0, util_1.debugLog)('Verified.');
// Check entitlements if applicable
(0, util_1.debugLog)('Displaying entitlements...');
const result = await (0, util_1.execFileAsync)('codesign', [
'--display',
'--entitlements',
':-',
opts.app
]);
(0, util_1.debugLog)('Entitlements:', '\n', result);
}
/**
* Signs a macOS application.
* @returns A void Promise once the signing operation is complete.
*
* @category Codesign
*/
async function signApp(_opts) {
(0, util_1.debugLog)('electron-osx-sign@%s', pkgVersion);
const validatedOpts = await validateSignOpts(_opts);
let identities = [];
let identityInUse = null;
// Determine identity for signing
if (validatedOpts.identity) {
(0, util_1.debugLog)('`identity` passed in arguments.');
if (validatedOpts.identityValidation === false) {
identityInUse = new util_identities_1.Identity(validatedOpts.identity);
}
else {
identities = await (0, util_identities_1.findIdentities)(validatedOpts.keychain || null, validatedOpts.identity);
}
}
else {
(0, util_1.debugWarn)('No `identity` passed in arguments...');
if (validatedOpts.platform === 'mas') {
if (validatedOpts.type === 'distribution') {
(0, util_1.debugLog)('Finding `3rd Party Mac Developer Application` certificate for signing app distribution in the Mac App Store...');
identities = await (0, util_identities_1.findIdentities)(validatedOpts.keychain || null, '3rd Party Mac Developer Application:');
}
else {
(0, util_1.debugLog)('Finding `Mac Developer` certificate for signing app in development for the Mac App Store signing...');
identities = await (0, util_identities_1.findIdentities)(validatedOpts.keychain || null, 'Mac Developer:');
}
}
else {
(0, util_1.debugLog)('Finding `Developer ID Application` certificate for distribution outside the Mac App Store...');
identities = await (0, util_identities_1.findIdentities)(validatedOpts.keychain || null, 'Developer ID Application:');
}
}
if (!identityInUse) {
if (identities.length > 0) {
// Identity(/ies) found
if (identities.length > 1) {
(0, util_1.debugWarn)('Multiple identities found, will use the first discovered.');
}
else {
(0, util_1.debugLog)('Found 1 identity.');
}
identityInUse = identities[0];
}
else {
// No identity found
throw new Error('No identity found for signing.');
}
}
// Pre-sign operations
if (validatedOpts.preEmbedProvisioningProfile === false) {
(0, util_1.debugWarn)('Pre-sign operation disabled for provisioning profile embedding:', '\n', '* Enable by setting `pre-embed-provisioning-profile` to `true`.');
}
else {
(0, util_1.debugLog)('Pre-sign operation enabled for provisioning profile:', '\n', '* Disable by setting `pre-embed-provisioning-profile` to `false`.');
await (0, util_provisioning_profiles_1.preEmbedProvisioningProfile)(validatedOpts, validatedOpts.provisioningProfile
? await (0, util_provisioning_profiles_1.getProvisioningProfile)(validatedOpts.provisioningProfile, validatedOpts.keychain)
: null);
}
(0, util_1.debugLog)('Signing application...', '\n', '> Application:', validatedOpts.app, '\n', '> Platform:', validatedOpts.platform, '\n', '> Additional binaries:', validatedOpts.binaries, '\n', '> Identity:', validatedOpts.identity);
await signApplication(validatedOpts, identityInUse);
// Post-sign operations
(0, util_1.debugLog)('Application signed.');
}
exports.signApp = signApp;
/**
* This function is a legacy callback implementation.
*
* @deprecated Please use the Promise-based {@link signAsync} method instead.
* @category Codesign
*/
const sign = (opts, cb) => {
signApp(opts)
.then(() => {
(0, util_1.debugLog)('Application signed: ' + opts.app);
if (cb)
cb();
})
.catch((err) => {
if (err.message)
(0, util_1.debugLog)(err.message);
else if (err.stack)
(0, util_1.debugLog)(err.stack);
else
(0, util_1.debugLog)(err);
if (cb)
cb(err);
});
};
exports.sign = sign;
//# sourceMappingURL=sign.js.map
File diff suppressed because one or more lines are too long
-258
View File
@@ -1,258 +0,0 @@
/**
* macOS applications can be distributed via the Mac App Store (MAS) or directly
* downloaded from the developer's website. @electron/osx-sign distinguishes between
* MAS apps (`mas`) or non-MAS apps (`darwin`).
* @category Utility
*/
export type ElectronMacPlatform = 'darwin' | 'mas';
/**
* MAS apps can be signed using Development or Distribution certificates.
* See [Apple Documentation](https://developer.apple.com/help/account/create-certificates/certificates-overview/) for more info.
* @category Utility
*/
export type SigningDistributionType = 'development' | 'distribution';
/**
* @interface
* @internal
*/
export type BaseSignOptions = Readonly<{
/**
* Path to the application package.
* Needs to end with the file extension `.app`.
*/
app: string;
/**
* The keychain name.
*
* @defaultValue `login`
*/
keychain?: string;
/**
* Build platform of your Electron app.
* Allowed values: `darwin` (Direct Download App), `mas` (Mac App Store).
*
* @defaultValue Determined by presence of `Squirrel.framework` within the application bundle,
* which is used for non-MAS apps.
*/
platform?: ElectronMacPlatform;
/**
* Name of the certificate to use when signing.
*
* @defaultValue Selected with respect to {@link SignOptions.provisioningProfile | provisioningProfile}
* and {@link SignOptions.platform | platform} from the selected {@link SignOptions.keychain | keychain}.
* * `mas` will look for `3rd Party Mac Developer Application: * (*)`
* * `darwin` will look for `Developer ID Application: * (*)` by default.
*/
identity?: string;
}>;
type OnlyValidatedBaseSignOptions = {
platform: ElectronMacPlatform;
};
/**
* A set of signing options that can be overriden on a per-file basis.
* Any missing options will use the default values, and providing a partial structure
* will shallow merge with the default values.
* @interface
* @category Codesign
*/
export type PerFileSignOptions = {
/**
* String specifying the path to an `entitlements.plist` file.
* Can also be an array of entitlement keys that osx-sign will write to an entitlements file for you.
*
* @defaultValue `@electron/osx-sign`'s built-in entitlements files.
*/
entitlements?: string | string[];
/**
* Whether to enable [Hardened Runtime](https://developer.apple.com/documentation/security/hardened_runtime)
* for this file.
*
* Note: Hardened Runtime is a pre-requisite for notarization, which is mandatory for apps running on macOS 10.15 and above.
*
* @defaultValue `true`
*/
hardenedRuntime?: boolean;
/**
* Either a string beginning with `=` which specifies in plain text the
* [signing requirements](https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/RequirementLang/RequirementLang.html)
* that you recommend to be used to evaluate the code signature, or a string specifying a path to a text or
* properly encoded `.rqset` file which contains those requirements.
*/
requirements?: string;
/**
* When signing, a set of option flags can be specified to change the behavior of the system when using the signed code.
* Accepts an array of strings or a comma-separated string.
*
* See --options of the `codesign` command.
*
* https://keith.github.io/xcode-man-pages/codesign.1.html#OPTION_FLAGS
*/
signatureFlags?: string | string[];
/**
* String specifying the URL of the timestamp authority server.
* Please note that this default server may not support signatures not furnished by Apple.
* Disable the timestamp service with `none`.
*
* @defaultValue Uses the Apple-provided timestamp server.
*/
timestamp?: string;
/**
* Additional raw arguments to pass to the `codesign` command.
*
* These can be things like `--deep` for instance when code signing specific resources that may
* require such arguments.
*
* https://keith.github.io/xcode-man-pages/codesign.1.html#OPTIONS
*/
additionalArguments?: string[];
};
/**
* @interface
* @internal
*/
export type OnlySignOptions = {
/**
* Array of paths to additional binaries that will be signed along with built-ins of Electron.
*
* @defaultValue `undefined`
*/
binaries?: string[];
/**
* Function that receives the path to a file and can return the entitlements to use for that file to override the default behavior. The
* object this function returns can include any of the following optional keys. Any properties that are returned **override** the default
* values that `@electron/osx-sign` generates. Any properties not returned use the default value.
*
* @param filePath Path to file
* @returns Override signing options
*/
optionsForFile?: (filePath: string) => PerFileSignOptions;
/**
* Flag to enable/disable validation for the signing identity.
* If enabled, the {@link SignOptions.identity | identity} provided
* will be validated in the {@link BaseSignOptions.keychain | keychain} specified.
*
* @defaultValue `true`
*/
identityValidation?: boolean;
/**
* Defines files that will be skipped during the code signing process.
* This property accepts a regex, function or an array of regexes and functions.
* Elements of other types are treated as `RegExp`.
*
* File paths matching a regex or returning a `true` value from a function will be ignored.
*
* @defaultValue `undefined`
*/
ignore?: string | string[] | ((file: string) => boolean);
/**
* Flag to enable/disable entitlements automation tasks necessary for code signing most Electron apps.
* * Adds [`com.apple.security.application-groups`](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_application-groups) to the entitlements file
* * Fills in the `ElectronTeamID` property in `Info.plist` with the provisioning profile's Team Identifier or by parsing the identity name.
*
* @defaultValue `true`
*/
preAutoEntitlements?: boolean;
/**
* Flag to enable/disable the embedding of a provisioning profile into the app's `Contents` folder.
* Will use the profile from {@link OnlySignOptions.provisioningProfile} if provided. Otherwise, it
* searches for a `.provisionprofile` file in the current working directory.
*
* @defaultValue `true`
*/
preEmbedProvisioningProfile?: boolean;
/**
* Path to a provisioning profile, which can be used to grant restricted entitlements to your app.
*
* See [Apple Documentation](https://developer.apple.com/documentation/technotes/tn3125-inside-code-signing-provisioning-profiles) for more details.
*/
provisioningProfile?: string;
/**
* Flag to enable/disable the `--strict` flag when verifying the signed application bundle.
* Also supports string values to specify which strict restrictions to use, see codesign man page for supported values.
*
* @defaultValue `true`
*/
strictVerify?: boolean | string;
/**
* Type of certificate to use when signing a MAS app.
* @defaultValue `"distribution"`
*/
type?: SigningDistributionType;
/**
* Build version of Electron. Values may be like: `1.1.1`, `1.2.0`. For use for signing legacy versions
* of Electron to ensure backwards compatibility.
*/
version?: string;
};
type OnlyValidatedSignOptions = {
ignore?: (string | ((file: string) => boolean))[];
type: SigningDistributionType;
};
type OnlyFlatOptions = {
/**
* Flag to enable/disable validation for the signing identity.
* If enabled, the {@link BaseSignOptions.identity | identity} provided
* will be validated in the {@link BaseSignOptions.keychain | keychain} specified.
*
* @defaultValue `true`
*/
identityValidation?: boolean;
/**
* Path to install the bundle.
* @defaultValue `"/Applications"`
*/
install?: string;
/**
* Output path for the flattened installer package.
* Needs file extension `.pkg`.
*
* @defaultValue Inferred from the app name passed into `opts.app`.
*/
pkg?: string;
/**
* Path to a directory containing `preinstall.sh` or `postinstall.sh` scripts.
* These must be executable and will run on pre/postinstall depending on the file
* name.
*
* This option is only valid if {@link FlatOptions.platform} is set to `darwin`.
*/
scripts?: string;
};
type OnlyValidatedFlatOptions = {
install: string;
pkg: string;
};
/**
* Utility type that represents an `UnValidated` type after validation,
* replacing any properties in the unvalidated type that also exist in the
* `Validated` type with the validated versions.
*
* @template UnValidated - The type representing the unvalidated form.
* @template Validated - The type representing the validated form.
*/
type ValidatedForm<UnValidated, Validated> = Omit<UnValidated, keyof Validated> & Validated;
type ValidatedBaseSignOptions = Readonly<ValidatedForm<BaseSignOptions, OnlyValidatedBaseSignOptions>>;
type _SignOptions = Readonly<OnlySignOptions & BaseSignOptions>;
/**
* Options for codesigning a packaged `.app` bundle.
* @category Codesign
*/
export interface SignOptions extends _SignOptions {
}
/**
* @internal
*/
export type ValidatedSignOptions = Readonly<ValidatedForm<OnlySignOptions, OnlyValidatedSignOptions> & ValidatedBaseSignOptions>;
type _FlatOptions = Readonly<OnlyFlatOptions & BaseSignOptions>;
/**
* Options for creating a flat `.pkg` installer.
* @category Flat
*/
export interface FlatOptions extends _FlatOptions {
}
/**
* @internal
*/
export type ValidatedFlatOptions = Readonly<ValidatedForm<OnlyFlatOptions, OnlyValidatedFlatOptions> & ValidatedBaseSignOptions>;
export {};
-3
View File
@@ -1,3 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=types.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
-17
View File
@@ -1,17 +0,0 @@
import { PerFileSignOptions, ValidatedSignOptions } from './types';
import { Identity } from './util-identities';
import { ProvisioningProfile } from './util-provisioning-profiles';
type ComputedOptions = {
identity: Identity;
provisioningProfile?: ProvisioningProfile;
};
/**
* This function returns a promise completing the entitlements automation: The
* process includes checking in `Info.plist` for `ElectronTeamID` or setting
* parsed value from identity, and checking in entitlements file for
* `com.apple.security.application-groups` or inserting new into array. A
* temporary entitlements file may be created to replace the input for any
* changes introduced.
*/
export declare function preAutoEntitlements(opts: ValidatedSignOptions, perFileOpts: PerFileSignOptions, computed: ComputedOptions): Promise<void | string>;
export {};
-133
View File
@@ -1,133 +0,0 @@
"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.preAutoEntitlements = void 0;
const fs = __importStar(require("fs-extra"));
const os = __importStar(require("os"));
const path = __importStar(require("path"));
const plist = __importStar(require("plist"));
const util_1 = require("./util");
const preAuthMemo = new Map();
/**
* This function returns a promise completing the entitlements automation: The
* process includes checking in `Info.plist` for `ElectronTeamID` or setting
* parsed value from identity, and checking in entitlements file for
* `com.apple.security.application-groups` or inserting new into array. A
* temporary entitlements file may be created to replace the input for any
* changes introduced.
*/
async function preAutoEntitlements(opts, perFileOpts, computed) {
var _a;
if (!perFileOpts.entitlements)
return;
const memoKey = [opts.app, perFileOpts.entitlements].join('---');
if (preAuthMemo.has(memoKey))
return preAuthMemo.get(memoKey);
// If entitlements file not provided, default will be used. Fixes #41
const appInfoPath = path.join((0, util_1.getAppContentsPath)(opts), 'Info.plist');
(0, util_1.debugLog)('Automating entitlement app group...', '\n', '> Info.plist:', appInfoPath, '\n');
let entitlements;
if (typeof perFileOpts.entitlements === 'string') {
const entitlementsContents = await fs.readFile(perFileOpts.entitlements, 'utf8');
entitlements = plist.parse(entitlementsContents);
}
else {
entitlements = perFileOpts.entitlements.reduce((dict, entitlementKey) => (Object.assign(Object.assign({}, dict), { [entitlementKey]: true })), {});
}
if (!entitlements['com.apple.security.app-sandbox']) {
// Only automate when app sandbox enabled by user
return;
}
const appInfoContents = await fs.readFile(appInfoPath, 'utf8');
const appInfo = plist.parse(appInfoContents);
// Use ElectronTeamID in Info.plist if already specified
if (appInfo.ElectronTeamID) {
(0, util_1.debugLog)('`ElectronTeamID` found in `Info.plist`: ' + appInfo.ElectronTeamID);
}
else {
// The team identifier in signing identity should not be trusted
if (computed.provisioningProfile) {
appInfo.ElectronTeamID =
computed.provisioningProfile.message.Entitlements['com.apple.developer.team-identifier'];
(0, util_1.debugLog)('`ElectronTeamID` not found in `Info.plist`, use parsed from provisioning profile: ' +
appInfo.ElectronTeamID);
}
else {
const teamID = (_a = /^.+\((.+?)\)$/g.exec(computed.identity.name)) === null || _a === void 0 ? void 0 : _a[1];
if (!teamID) {
throw new Error(`Could not automatically determine ElectronTeamID from identity: ${computed.identity.name}`);
}
appInfo.ElectronTeamID = teamID;
(0, util_1.debugLog)('`ElectronTeamID` not found in `Info.plist`, use parsed from signing identity: ' +
appInfo.ElectronTeamID);
}
await fs.writeFile(appInfoPath, plist.build(appInfo), 'utf8');
(0, util_1.debugLog)('`Info.plist` updated:', '\n', '> Info.plist:', appInfoPath);
}
const appIdentifier = appInfo.ElectronTeamID + '.' + appInfo.CFBundleIdentifier;
// Insert application identifier if not exists
if (entitlements['com.apple.application-identifier']) {
(0, util_1.debugLog)('`com.apple.application-identifier` found in entitlements file: ' +
entitlements['com.apple.application-identifier']);
}
else {
(0, util_1.debugLog)('`com.apple.application-identifier` not found in entitlements file, new inserted: ' +
appIdentifier);
entitlements['com.apple.application-identifier'] = appIdentifier;
}
// Insert developer team identifier if not exists
if (entitlements['com.apple.developer.team-identifier']) {
(0, util_1.debugLog)('`com.apple.developer.team-identifier` found in entitlements file: ' +
entitlements['com.apple.developer.team-identifier']);
}
else {
(0, util_1.debugLog)('`com.apple.developer.team-identifier` not found in entitlements file, new inserted: ' +
appInfo.ElectronTeamID);
entitlements['com.apple.developer.team-identifier'] = appInfo.ElectronTeamID;
}
// Init entitlements app group key to array if not exists
if (!entitlements['com.apple.security.application-groups']) {
entitlements['com.apple.security.application-groups'] = [];
}
// Insert app group if not exists
if (Array.isArray(entitlements['com.apple.security.application-groups']) &&
entitlements['com.apple.security.application-groups'].indexOf(appIdentifier) === -1) {
(0, util_1.debugLog)('`com.apple.security.application-groups` not found in entitlements file, new inserted: ' +
appIdentifier);
entitlements['com.apple.security.application-groups'].push(appIdentifier);
}
else {
(0, util_1.debugLog)('`com.apple.security.application-groups` found in entitlements file: ' + appIdentifier);
}
// Create temporary entitlements file
const dir = await fs.mkdtemp(path.resolve(os.tmpdir(), 'tmp-entitlements-'));
const entitlementsPath = path.join(dir, 'entitlements.plist');
await fs.writeFile(entitlementsPath, plist.build(entitlements), 'utf8');
(0, util_1.debugLog)('Entitlements file updated:', '\n', '> Entitlements:', entitlementsPath);
preAuthMemo.set(memoKey, entitlementsPath);
return entitlementsPath;
}
exports.preAutoEntitlements = preAutoEntitlements;
//# sourceMappingURL=util-entitlements.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"util-entitlements.js","sourceRoot":"","sources":["../../src/util-entitlements.ts"],"names":[],"mappings":"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"}
-6
View File
@@ -1,6 +0,0 @@
export declare class Identity {
name: string;
hash?: string | undefined;
constructor(name: string, hash?: string | undefined);
}
export declare function findIdentities(keychain: string | null, identity: string): Promise<Identity[]>;
-35
View File
@@ -1,35 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.findIdentities = exports.Identity = void 0;
const util_1 = require("./util");
class Identity {
constructor(name, hash) {
this.name = name;
this.hash = hash;
}
}
exports.Identity = Identity;
async function findIdentities(keychain, identity) {
// Only to look for valid identities, excluding those flagged with
// CSSMERR_TP_CERT_EXPIRED or CSSMERR_TP_NOT_TRUSTED. Fixes #9
const args = [
'find-identity',
'-v'
];
if (keychain) {
args.push(keychain);
}
const result = await (0, util_1.execFileAsync)('security', args);
const identities = result.split('\n').map(function (line) {
if (line.indexOf(identity) >= 0) {
const identityFound = line.substring(line.indexOf('"') + 1, line.lastIndexOf('"'));
const identityHashFound = line.substring(line.indexOf(')') + 2, line.indexOf('"') - 1);
(0, util_1.debugLog)('Identity:', '\n', '> Name:', identityFound, '\n', '> Hash:', identityHashFound);
return new Identity(identityFound, identityHashFound);
}
return null;
});
return (0, util_1.compactFlattenedList)(identities);
}
exports.findIdentities = findIdentities;
//# sourceMappingURL=util-identities.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"util-identities.js","sourceRoot":"","sources":["../../src/util-identities.ts"],"names":[],"mappings":";;;AAAA,iCAAuE;AAEvE,MAAa,QAAQ;IACnB,YAAoB,IAAY,EAAS,IAAa;QAAlC,SAAI,GAAJ,IAAI,CAAQ;QAAS,SAAI,GAAJ,IAAI,CAAS;IAAG,CAAC;CAC3D;AAFD,4BAEC;AAEM,KAAK,UAAU,cAAc,CAAE,QAAuB,EAAE,QAAgB;IAC7E,kEAAkE;IAClE,8DAA8D;IAE9D,MAAM,IAAI,GAAG;QACX,eAAe;QACf,IAAI;KACL,CAAC;IACF,IAAI,QAAQ,EAAE;QACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACrB;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAa,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI;QACtD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACnF,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACvF,IAAA,eAAQ,EAAC,WAAW,EAAE,IAAI,EACxB,SAAS,EAAE,aAAa,EAAE,IAAI,EAC9B,SAAS,EAAE,iBAAiB,CAAC,CAAC;YAChC,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;SACvD;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,IAAA,2BAAoB,EAAC,UAAU,CAAC,CAAC;AAC1C,CAAC;AA3BD,wCA2BC"}
@@ -1,25 +0,0 @@
import { ElectronMacPlatform, ValidatedSignOptions } from './types';
export declare class ProvisioningProfile {
filePath: string;
message: any;
constructor(filePath: string, message: any);
get name(): string;
get platforms(): ElectronMacPlatform[];
get type(): "development" | "distribution";
}
/**
* Returns a promise resolving to a ProvisioningProfile instance based on file.
* @function
* @param {string} filePath - Path to provisioning profile.
* @param {string} keychain - Keychain to use when unlocking provisioning profile.
* @returns {Promise} Promise.
*/
export declare function getProvisioningProfile(filePath: string, keychain?: string | null): Promise<ProvisioningProfile>;
/**
* Returns a promise resolving to a list of suitable provisioning profile within the current working directory.
*/
export declare function findProvisioningProfiles(opts: ValidatedSignOptions): Promise<ProvisioningProfile[]>;
/**
* Returns a promise embedding the provisioning profile in the app Contents folder.
*/
export declare function preEmbedProvisioningProfile(opts: ValidatedSignOptions, profile: ProvisioningProfile | null): Promise<void>;
-148
View File
@@ -1,148 +0,0 @@
"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.preEmbedProvisioningProfile = exports.findProvisioningProfiles = exports.getProvisioningProfile = exports.ProvisioningProfile = void 0;
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
const plist_1 = __importDefault(require("plist"));
const util_1 = require("./util");
class ProvisioningProfile {
constructor(filePath, message) {
this.filePath = filePath;
this.message = message;
}
get name() {
return this.message.Name;
}
get platforms() {
if ('ProvisionsAllDevices' in this.message)
return ['darwin'];
// Developer ID
else if (this.type === 'distribution')
return ['mas'];
// Mac App Store
else
return ['darwin', 'mas']; // Mac App Development
}
get type() {
if ('ProvisionedDevices' in this.message)
return 'development';
// Mac App Development
else
return 'distribution'; // Developer ID or Mac App Store
}
}
exports.ProvisioningProfile = ProvisioningProfile;
/**
* Returns a promise resolving to a ProvisioningProfile instance based on file.
* @function
* @param {string} filePath - Path to provisioning profile.
* @param {string} keychain - Keychain to use when unlocking provisioning profile.
* @returns {Promise} Promise.
*/
async function getProvisioningProfile(filePath, keychain = null) {
const securityArgs = [
'cms',
'-D',
'-i',
filePath // Use infile as source of data
];
if (keychain) {
securityArgs.push('-k', keychain);
}
const result = await (0, util_1.execFileAsync)('security', securityArgs);
const provisioningProfile = new ProvisioningProfile(filePath, plist_1.default.parse(result));
(0, util_1.debugLog)('Provisioning profile:', '\n', '> Name:', provisioningProfile.name, '\n', '> Platforms:', provisioningProfile.platforms, '\n', '> Type:', provisioningProfile.type, '\n', '> Path:', provisioningProfile.filePath, '\n', '> Message:', provisioningProfile.message);
return provisioningProfile;
}
exports.getProvisioningProfile = getProvisioningProfile;
/**
* Returns a promise resolving to a list of suitable provisioning profile within the current working directory.
*/
async function findProvisioningProfiles(opts) {
const cwd = process.cwd();
const children = await fs.readdir(cwd);
const foundProfiles = (0, util_1.compactFlattenedList)(await Promise.all(children.map(async (child) => {
const filePath = path.resolve(cwd, child);
const stat = await fs.stat(filePath);
if (stat.isFile() && path.extname(filePath) === '.provisionprofile') {
return filePath;
}
return null;
})));
return (0, util_1.compactFlattenedList)(await Promise.all(foundProfiles.map(async (filePath) => {
const profile = await getProvisioningProfile(filePath);
if (profile.platforms.indexOf(opts.platform) >= 0 && profile.type === opts.type) {
return profile;
}
(0, util_1.debugWarn)('Provisioning profile above ignored, not for ' + opts.platform + ' ' + opts.type + '.');
return null;
})));
}
exports.findProvisioningProfiles = findProvisioningProfiles;
/**
* Returns a promise embedding the provisioning profile in the app Contents folder.
*/
async function preEmbedProvisioningProfile(opts, profile) {
async function embedProvisioningProfile(profile) {
(0, util_1.debugLog)('Looking for existing provisioning profile...');
const embeddedFilePath = path.join((0, util_1.getAppContentsPath)(opts), 'embedded.provisionprofile');
if (await fs.pathExists(embeddedFilePath)) {
(0, util_1.debugLog)('Found embedded provisioning profile:', '\n', '* Please manually remove the existing file if not wanted.', '\n', '* Current file at:', embeddedFilePath);
}
else {
(0, util_1.debugLog)('Embedding provisioning profile...');
await fs.copy(profile.filePath, embeddedFilePath);
}
}
if (profile) {
// User input provisioning profile
return await embedProvisioningProfile(profile);
}
else {
// Discover provisioning profile
(0, util_1.debugLog)('No `provisioning-profile` passed in arguments, will find in current working directory and in user library...');
const profiles = await findProvisioningProfiles(opts);
if (profiles.length > 0) {
// Provisioning profile(s) found
if (profiles.length > 1) {
(0, util_1.debugLog)('Multiple provisioning profiles found, will use the first discovered.');
}
else {
(0, util_1.debugLog)('Found 1 provisioning profile.');
}
await embedProvisioningProfile(profiles[0]);
}
else {
// No provisioning profile found
(0, util_1.debugLog)('No provisioning profile found, will not embed profile in app contents.');
}
}
}
exports.preEmbedProvisioningProfile = preEmbedProvisioningProfile;
//# sourceMappingURL=util-provisioning-profiles.js.map
@@ -1 +0,0 @@
{"version":3,"file":"util-provisioning-profiles.js","sourceRoot":"","sources":["../../src/util-provisioning-profiles.ts"],"names":[],"mappings":"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"}
-36
View File
@@ -1,36 +0,0 @@
/// <reference types="node" />
import * as child from 'child_process';
import debug from 'debug';
import { BaseSignOptions, ElectronMacPlatform } from './types';
export declare const debugLog: debug.Debugger;
export declare const debugWarn: debug.Debugger;
export declare function execFileAsync(file: string, args: string[], options?: child.ExecFileOptions): Promise<string>;
type DeepListItem<T> = null | T | DeepListItem<T>[];
type DeepList<T> = DeepListItem<T>[];
export declare function compactFlattenedList<T>(list: DeepList<T>): T[];
/**
* Returns the path to the "Contents" folder inside the application bundle
*/
export declare function getAppContentsPath(opts: BaseSignOptions): string;
/**
* Returns the path to app "Frameworks" within contents.
*/
export declare function getAppFrameworksPath(opts: BaseSignOptions): string;
export declare function detectElectronPlatform(opts: BaseSignOptions): Promise<ElectronMacPlatform>;
/**
* This function returns a promise validating opts.app, the application to be signed or flattened.
*/
export declare function validateOptsApp(opts: BaseSignOptions): Promise<void>;
/**
* This function returns a promise validating opts.platform, the platform of Electron build. It allows auto-discovery if no opts.platform is specified.
*/
export declare function validateOptsPlatform(opts: BaseSignOptions): Promise<ElectronMacPlatform>;
/**
* This function returns a promise resolving all child paths within the directory specified.
* @function
* @param {string} dirPath - Path to directory.
* @returns {Promise} Promise resolving child paths needing signing in order.
* @internal
*/
export declare function walkAsync(dirPath: string): Promise<string[]>;
export {};
-183
View File
@@ -1,183 +0,0 @@
"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.walkAsync = exports.validateOptsPlatform = exports.validateOptsApp = exports.detectElectronPlatform = exports.getAppFrameworksPath = exports.getAppContentsPath = exports.compactFlattenedList = exports.execFileAsync = exports.debugWarn = exports.debugLog = void 0;
const child = __importStar(require("child_process"));
const fs = __importStar(require("fs-extra"));
const isbinaryfile_1 = require("isbinaryfile");
const path = __importStar(require("path"));
const debug_1 = __importDefault(require("debug"));
exports.debugLog = (0, debug_1.default)('electron-osx-sign');
exports.debugLog.log = console.log.bind(console);
exports.debugWarn = (0, debug_1.default)('electron-osx-sign:warn');
exports.debugWarn.log = console.warn.bind(console);
const removePassword = function (input) {
return input.replace(/(-P |pass:|\/p|-pass )([^ ]+)/, function (_, p1) {
return `${p1}***`;
});
};
async function execFileAsync(file, args, options = {}) {
if (exports.debugLog.enabled) {
(0, exports.debugLog)('Executing...', file, args && Array.isArray(args) ? removePassword(args.join(' ')) : '');
}
return new Promise(function (resolve, reject) {
child.execFile(file, args, options, function (err, stdout, stderr) {
if (err) {
(0, exports.debugLog)('Error executing file:', '\n', '> Stdout:', stdout, '\n', '> Stderr:', stderr);
reject(err);
return;
}
resolve(stdout);
});
});
}
exports.execFileAsync = execFileAsync;
function compactFlattenedList(list) {
const result = [];
function populateResult(list) {
if (!Array.isArray(list)) {
if (list)
result.push(list);
}
else if (list.length > 0) {
for (const item of list)
if (item)
populateResult(item);
}
}
populateResult(list);
return result;
}
exports.compactFlattenedList = compactFlattenedList;
/**
* Returns the path to the "Contents" folder inside the application bundle
*/
function getAppContentsPath(opts) {
return path.join(opts.app, 'Contents');
}
exports.getAppContentsPath = getAppContentsPath;
/**
* Returns the path to app "Frameworks" within contents.
*/
function getAppFrameworksPath(opts) {
return path.join(getAppContentsPath(opts), 'Frameworks');
}
exports.getAppFrameworksPath = getAppFrameworksPath;
async function detectElectronPlatform(opts) {
const appFrameworksPath = getAppFrameworksPath(opts);
if (await fs.pathExists(path.resolve(appFrameworksPath, 'Squirrel.framework'))) {
return 'darwin';
}
else {
return 'mas';
}
}
exports.detectElectronPlatform = detectElectronPlatform;
/**
* This function returns a promise resolving the file path if file binary.
*/
async function getFilePathIfBinary(filePath) {
if (await (0, isbinaryfile_1.isBinaryFile)(filePath)) {
return filePath;
}
return null;
}
/**
* This function returns a promise validating opts.app, the application to be signed or flattened.
*/
async function validateOptsApp(opts) {
if (!opts.app) {
throw new Error('Path to application must be specified.');
}
if (path.extname(opts.app) !== '.app') {
throw new Error('Extension of application must be `.app`.');
}
if (!(await fs.pathExists(opts.app))) {
throw new Error(`Application at path "${opts.app}" could not be found`);
}
}
exports.validateOptsApp = validateOptsApp;
/**
* This function returns a promise validating opts.platform, the platform of Electron build. It allows auto-discovery if no opts.platform is specified.
*/
async function validateOptsPlatform(opts) {
if (opts.platform) {
if (opts.platform === 'mas' || opts.platform === 'darwin') {
return opts.platform;
}
else {
(0, exports.debugWarn)('`platform` passed in arguments not supported, checking Electron platform...');
}
}
else {
(0, exports.debugWarn)('No `platform` passed in arguments, checking Electron platform...');
}
return await detectElectronPlatform(opts);
}
exports.validateOptsPlatform = validateOptsPlatform;
/**
* This function returns a promise resolving all child paths within the directory specified.
* @function
* @param {string} dirPath - Path to directory.
* @returns {Promise} Promise resolving child paths needing signing in order.
* @internal
*/
async function walkAsync(dirPath) {
(0, exports.debugLog)('Walking... ' + dirPath);
async function _walkAsync(dirPath) {
const children = await fs.readdir(dirPath);
return await Promise.all(children.map(async (child) => {
const filePath = path.resolve(dirPath, child);
const stat = await fs.stat(filePath);
if (stat.isFile()) {
switch (path.extname(filePath)) {
case '.cstemp': // Temporary file generated from past codesign
(0, exports.debugLog)('Removing... ' + filePath);
await fs.remove(filePath);
return null;
default:
return await getFilePathIfBinary(filePath);
}
}
else if (stat.isDirectory() && !stat.isSymbolicLink()) {
const walkResult = await _walkAsync(filePath);
switch (path.extname(filePath)) {
case '.app': // Application
case '.framework': // Framework
walkResult.push(filePath);
}
return walkResult;
}
return null;
}));
}
const allPaths = await _walkAsync(dirPath);
return compactFlattenedList(allPaths);
}
exports.walkAsync = walkAsync;
//# sourceMappingURL=util.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"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"}
-15
View File
@@ -1,15 +0,0 @@
import { FlatOptions } from './types';
/**
* Generates a flat `.pkg` installer for a packaged Electron `.app` bundle.
* @returns A void Promise once the flattening operation is complete.
*
* @category Flat
*/
export declare function buildPkg(_opts: FlatOptions): Promise<void>;
/**
* This function is exported with normal callback implementation.
*
* @deprecated Please use the Promise-based {@link flatAsync} method instead.
* @category Flat
*/
export declare const flat: (opts: FlatOptions, cb?: ((error?: Error) => void) | undefined) => void;
-151
View File
@@ -1,151 +0,0 @@
import * as path from 'path';
import { debugLog, debugWarn, execFileAsync, validateOptsApp, validateOptsPlatform } from './util';
import { findIdentities } from './util-identities';
const pkgVersion = require('../../package.json').version;
/**
* This function returns a promise validating all options passed in opts.
* @function
* @param {Object} opts - Options.
* @returns {Promise} Promise.
*/
async function validateFlatOpts(opts) {
await validateOptsApp(opts);
let pkg = opts.pkg;
if (pkg) {
if (typeof pkg !== 'string')
throw new Error('`pkg` must be a string.');
if (path.extname(pkg) !== '.pkg') {
throw new Error('Extension of output package must be `.pkg`.');
}
}
else {
debugWarn('No `pkg` passed in arguments, will fallback to default inferred from the given application.');
pkg = path.join(path.dirname(opts.app), path.basename(opts.app, '.app') + '.pkg');
}
let install = opts.install;
if (install) {
if (typeof install !== 'string') {
return Promise.reject(new Error('`install` must be a string.'));
}
}
else {
debugWarn('No `install` passed in arguments, will fallback to default `/Applications`.');
install = '/Applications';
}
if (typeof opts.scripts === 'string' && opts.platform === 'mas') {
debugWarn('Mac App Store packages cannot have `scripts`, ignoring option.');
}
return Object.assign(Object.assign({}, opts), { pkg,
install, platform: await validateOptsPlatform(opts) });
}
/**
* This function returns a promise flattening the application.
* @param opts - Options for building the .pkg archive
*/
async function buildApplicationPkg(opts, identity) {
if (opts.platform === 'mas') {
const args = ['--component', opts.app, opts.install, '--sign', identity.name, opts.pkg];
if (opts.keychain) {
args.unshift('--keychain', opts.keychain);
}
debugLog('Flattening Mac App Store package... ' + opts.app);
await execFileAsync('productbuild', args);
}
else {
const componentPkgPath = path.join(path.dirname(opts.app), path.basename(opts.app, '.app') + '-component.pkg');
const pkgbuildArgs = [
'--install-location',
opts.install,
'--component',
opts.app,
componentPkgPath
];
if (opts.scripts) {
pkgbuildArgs.unshift('--scripts', opts.scripts);
}
debugLog('Building component package... ' + opts.app);
await execFileAsync('pkgbuild', pkgbuildArgs);
const args = ['--package', componentPkgPath, opts.install, '--sign', identity.name, opts.pkg];
if (opts.keychain) {
args.unshift('--keychain', opts.keychain);
}
debugLog('Flattening OS X Installer package... ' + opts.app);
await execFileAsync('productbuild', args);
await execFileAsync('rm', [componentPkgPath]);
}
}
/**
* Generates a flat `.pkg` installer for a packaged Electron `.app` bundle.
* @returns A void Promise once the flattening operation is complete.
*
* @category Flat
*/
export async function buildPkg(_opts) {
debugLog('@electron/osx-sign@%s', pkgVersion);
const validatedOptions = await validateFlatOpts(_opts);
let identities = [];
let identityInUse = null;
if (validatedOptions.identity) {
debugLog('`identity` passed in arguments.');
if (validatedOptions.identityValidation === false) {
// Do nothing
}
else {
identities = await findIdentities(validatedOptions.keychain || null, validatedOptions.identity);
}
}
else {
debugWarn('No `identity` passed in arguments...');
if (validatedOptions.platform === 'mas') {
debugLog('Finding `3rd Party Mac Developer Installer` certificate for flattening app distribution in the Mac App Store...');
identities = await findIdentities(validatedOptions.keychain || null, '3rd Party Mac Developer Installer:');
}
else {
debugLog('Finding `Developer ID Application` certificate for distribution outside the Mac App Store...');
identities = await findIdentities(validatedOptions.keychain || null, 'Developer ID Installer:');
}
}
if (identities.length > 0) {
// Provisioning profile(s) found
if (identities.length > 1) {
debugWarn('Multiple identities found, will use the first discovered.');
}
else {
debugLog('Found 1 identity.');
}
identityInUse = identities[0];
}
else {
// No identity found
throw new Error('No identity found for signing.');
}
debugLog('Flattening application...', '\n', '> Application:', validatedOptions.app, '\n', '> Package output:', validatedOptions.pkg, '\n', '> Install path:', validatedOptions.install, '\n', '> Identity:', validatedOptions.identity, '\n', '> Scripts:', validatedOptions.scripts);
await buildApplicationPkg(validatedOptions, identityInUse);
debugLog('Application flattened.');
}
/**
* This function is exported with normal callback implementation.
*
* @deprecated Please use the Promise-based {@link flatAsync} method instead.
* @category Flat
*/
export const flat = (opts, cb) => {
buildPkg(opts)
.then(() => {
debugLog('Application flattened, saved to: ' + opts.app);
if (cb)
cb();
})
.catch((err) => {
debugLog('Flat failed:');
if (err.message)
debugLog(err.message);
else if (err.stack)
debugLog(err.stack);
else
debugLog(err);
if (cb)
cb(err);
});
};
//# sourceMappingURL=flat.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"flat.js","sourceRoot":"","sources":["../../src/flat.ts"],"names":[],"mappings":"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"}
-5
View File
@@ -1,5 +0,0 @@
import { sign, signApp } from './sign';
import { flat, buildPkg } from './flat';
import { walkAsync } from './util';
export { sign, flat, signApp as signAsync, signApp, buildPkg as flatAsync, buildPkg, walkAsync };
export * from './types';
-16
View File
@@ -1,16 +0,0 @@
import { sign, signApp } from './sign';
import { flat, buildPkg } from './flat';
import { walkAsync } from './util';
// TODO: Remove and leave only proper named exports, but for non-breaking change reasons
// we need to keep this weirdness for now
module.exports = sign;
module.exports.sign = sign;
module.exports.signAsync = signApp;
module.exports.signApp = signApp;
module.exports.flat = flat;
module.exports.flatAsync = buildPkg;
module.exports.buildPkg = buildPkg;
module.exports.walkAsync = walkAsync;
export { sign, flat, signApp as signAsync, signApp, buildPkg as flatAsync, buildPkg, walkAsync };
export * from './types';
//# sourceMappingURL=index.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,wFAAwF;AACxF,yCAAyC;AACzC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;AACtB,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;AAC3B,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;AACnC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;AACjC,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;AAC3B,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC;AACpC,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACnC,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;AAErC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,SAAS,EAAE,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjG,cAAc,SAAS,CAAC"}
-15
View File
@@ -1,15 +0,0 @@
import { SignOptions } from './types';
/**
* Signs a macOS application.
* @returns A void Promise once the signing operation is complete.
*
* @category Codesign
*/
export declare function signApp(_opts: SignOptions): Promise<void>;
/**
* This function is a legacy callback implementation.
*
* @deprecated Please use the Promise-based {@link signAsync} method instead.
* @category Codesign
*/
export declare const sign: (opts: SignOptions, cb?: ((error?: Error) => void) | undefined) => void;
-346
View File
@@ -1,346 +0,0 @@
import * as fs from 'fs-extra';
import * as os from 'os';
import * as path from 'path';
import * as plist from 'plist';
import compareVersion from 'compare-version';
import { debugLog, debugWarn, getAppContentsPath, execFileAsync, validateOptsApp, validateOptsPlatform, walkAsync } from './util';
import { Identity, findIdentities } from './util-identities';
import { preEmbedProvisioningProfile, getProvisioningProfile } from './util-provisioning-profiles';
import { preAutoEntitlements } from './util-entitlements';
const pkgVersion = require('../../package.json').version;
const osRelease = os.release();
/**
* This function returns a promise validating opts.binaries, the additional binaries to be signed along with the discovered enclosed components.
*/
async function validateOptsBinaries(opts) {
if (opts.binaries) {
if (!Array.isArray(opts.binaries)) {
throw new Error('Additional binaries should be an Array.');
}
// TODO: Presence check for binary files, reject if any does not exist
}
}
function validateOptsIgnore(ignore) {
if (ignore && !(ignore instanceof Array)) {
return [ignore];
}
}
/**
* This function returns a promise validating all options passed in opts.
*/
async function validateSignOpts(opts) {
await validateOptsBinaries(opts);
await validateOptsApp(opts);
if (opts.provisioningProfile && typeof opts.provisioningProfile !== 'string') {
throw new Error('Path to provisioning profile should be a string.');
}
if (opts.type && opts.type !== 'development' && opts.type !== 'distribution') {
throw new Error('Type must be either `development` or `distribution`.');
}
const platform = await validateOptsPlatform(opts);
const cloned = Object.assign(Object.assign({}, opts), { ignore: validateOptsIgnore(opts.ignore), type: opts.type || 'distribution', platform });
return cloned;
}
/**
* This function returns a promise verifying the code sign of application bundle.
*/
async function verifySignApplication(opts) {
// Verify with codesign
debugLog('Verifying application bundle with codesign...');
const strictVerify = opts.strictVerify !== undefined ? opts.strictVerify : true;
await execFileAsync('codesign', ['--verify', '--deep'].concat(strictVerify !== false && compareVersion(osRelease, '15.0.0') >= 0 // Strict flag since darwin 15.0.0 --> OS X 10.11.0 El Capitan
? [
'--strict' +
(strictVerify !== true ? '=' + strictVerify : '')
]
: [], ['--verbose=2', opts.app]));
}
function defaultOptionsForFile(filePath, platform) {
const entitlementsFolder = path.resolve(__dirname, '..', '..', 'entitlements');
let entitlementsFile;
if (platform === 'darwin') {
// Default Entitlements
// c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/app-entitlements.plist
// Also include JIT for main process V8
entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.plist');
// Plugin helper
// c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/helper-plugin-entitlements.plist
if (filePath.includes('(Plugin).app')) {
entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.plugin.plist');
// GPU Helper
// c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/helper-gpu-entitlements.plist
}
else if (filePath.includes('(GPU).app')) {
entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.gpu.plist');
// Renderer Helper
// c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/helper-renderer-entitlements.plist
}
else if (filePath.includes('(Renderer).app')) {
entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.renderer.plist');
}
}
else {
// Default entitlements
// TODO: Can these be more scoped like the non-mas variant?
entitlementsFile = path.resolve(entitlementsFolder, 'default.mas.plist');
// If it is not the top level app bundle, we sign with inherit
if (filePath.includes('.app/')) {
entitlementsFile = path.resolve(entitlementsFolder, 'default.mas.child.plist');
}
}
return {
entitlements: entitlementsFile,
hardenedRuntime: true,
requirements: undefined,
signatureFlags: undefined,
timestamp: undefined,
additionalArguments: []
};
}
async function mergeOptionsForFile(opts, defaults) {
const mergedPerFileOptions = Object.assign({}, defaults);
if (opts) {
if (opts.entitlements !== undefined) {
if (Array.isArray(opts.entitlements)) {
const entitlements = opts.entitlements.reduce((dict, entitlementKey) => (Object.assign(Object.assign({}, dict), { [entitlementKey]: true })), {});
const dir = await fs.mkdtemp(path.resolve(os.tmpdir(), 'tmp-entitlements-'));
const entitlementsPath = path.join(dir, 'entitlements.plist');
await fs.writeFile(entitlementsPath, plist.build(entitlements), 'utf8');
opts.entitlements = entitlementsPath;
}
mergedPerFileOptions.entitlements = opts.entitlements;
}
if (opts.hardenedRuntime !== undefined) {
mergedPerFileOptions.hardenedRuntime = opts.hardenedRuntime;
}
if (opts.requirements !== undefined)
mergedPerFileOptions.requirements = opts.requirements;
if (opts.signatureFlags !== undefined) {
mergedPerFileOptions.signatureFlags = opts.signatureFlags;
}
if (opts.timestamp !== undefined)
mergedPerFileOptions.timestamp = opts.timestamp;
if (opts.additionalArguments !== undefined)
mergedPerFileOptions.additionalArguments = opts.additionalArguments;
}
return mergedPerFileOptions;
}
/**
* This function returns a promise codesigning only.
*/
async function signApplication(opts, identity) {
function shouldIgnoreFilePath(filePath) {
if (opts.ignore) {
return opts.ignore.some(function (ignore) {
if (typeof ignore === 'function') {
return ignore(filePath);
}
return filePath.match(ignore);
});
}
return false;
}
const children = await walkAsync(getAppContentsPath(opts));
if (opts.binaries)
children.push(...opts.binaries);
const args = ['--sign', identity.hash || identity.name, '--force'];
if (opts.keychain) {
args.push('--keychain', opts.keychain);
}
/**
* Sort the child paths by how deep they are in the file tree. Some arcane apple
* logic expects the deeper files to be signed first otherwise strange errors get
* thrown our way
*/
children.sort((a, b) => {
const aDepth = a.split(path.sep).length;
const bDepth = b.split(path.sep).length;
return bDepth - aDepth;
});
for (const filePath of [...children, opts.app]) {
if (shouldIgnoreFilePath(filePath)) {
debugLog('Skipped... ' + filePath);
continue;
}
const perFileOptions = await mergeOptionsForFile(opts.optionsForFile ? opts.optionsForFile(filePath) : null, defaultOptionsForFile(filePath, opts.platform));
// preAutoEntitlements should only be applied to the top level app bundle.
// Applying it other files will cause the app to crash and be rejected by Apple.
if (!filePath.includes('.app/')) {
if (opts.preAutoEntitlements === false) {
debugWarn('Pre-sign operation disabled for entitlements automation.');
}
else {
debugLog('Pre-sign operation enabled for entitlements automation with versions >= `1.1.1`:', '\n', '* Disable by setting `pre-auto-entitlements` to `false`.');
if (!opts.version || compareVersion(opts.version, '1.1.1') >= 0) {
// Enable Mac App Store sandboxing without using temporary-exception, introduced in Electron v1.1.1. Relates to electron#5601
const newEntitlements = await preAutoEntitlements(opts, perFileOptions, {
identity,
provisioningProfile: opts.provisioningProfile
? await getProvisioningProfile(opts.provisioningProfile, opts.keychain)
: undefined
});
// preAutoEntitlements may provide us new entitlements, if so we update our options
// and ensure that entitlements-loginhelper has a correct default value
if (newEntitlements) {
perFileOptions.entitlements = newEntitlements;
}
}
}
}
debugLog('Signing... ' + filePath);
const perFileArgs = [...args];
if (perFileOptions.requirements) {
if (perFileOptions.requirements.charAt(0) === '=') {
perFileArgs.push(`-r${perFileOptions.requirements}`);
}
else {
perFileArgs.push('--requirements', perFileOptions.requirements);
}
}
if (perFileOptions.timestamp) {
perFileArgs.push('--timestamp=' + perFileOptions.timestamp);
}
else {
perFileArgs.push('--timestamp');
}
let optionsArguments = [];
if (perFileOptions.signatureFlags) {
if (Array.isArray(perFileOptions.signatureFlags)) {
optionsArguments.push(...perFileOptions.signatureFlags);
}
else {
const flags = perFileOptions.signatureFlags.split(',').map(function (flag) {
return flag.trim();
});
optionsArguments.push(...flags);
}
}
if (perFileOptions.hardenedRuntime || optionsArguments.includes('runtime')) {
// Hardened runtime since darwin 17.7.0 --> macOS 10.13.6
if (compareVersion(osRelease, '17.7.0') >= 0) {
optionsArguments.push('runtime');
}
else {
// Remove runtime if passed in with --signature-flags
debugLog('Not enabling hardened runtime, current macOS version too low, requires 10.13.6 and higher');
optionsArguments = optionsArguments.filter((arg) => {
return arg !== 'runtime';
});
}
}
if (optionsArguments.length) {
perFileArgs.push('--options', [...new Set(optionsArguments)].join(','));
}
if (perFileOptions.additionalArguments) {
perFileArgs.push(...perFileOptions.additionalArguments);
}
await execFileAsync('codesign', perFileArgs.concat('--entitlements', perFileOptions.entitlements, filePath));
}
// Verify code sign
debugLog('Verifying...');
await verifySignApplication(opts);
debugLog('Verified.');
// Check entitlements if applicable
debugLog('Displaying entitlements...');
const result = await execFileAsync('codesign', [
'--display',
'--entitlements',
':-',
opts.app
]);
debugLog('Entitlements:', '\n', result);
}
/**
* Signs a macOS application.
* @returns A void Promise once the signing operation is complete.
*
* @category Codesign
*/
export async function signApp(_opts) {
debugLog('electron-osx-sign@%s', pkgVersion);
const validatedOpts = await validateSignOpts(_opts);
let identities = [];
let identityInUse = null;
// Determine identity for signing
if (validatedOpts.identity) {
debugLog('`identity` passed in arguments.');
if (validatedOpts.identityValidation === false) {
identityInUse = new Identity(validatedOpts.identity);
}
else {
identities = await findIdentities(validatedOpts.keychain || null, validatedOpts.identity);
}
}
else {
debugWarn('No `identity` passed in arguments...');
if (validatedOpts.platform === 'mas') {
if (validatedOpts.type === 'distribution') {
debugLog('Finding `3rd Party Mac Developer Application` certificate for signing app distribution in the Mac App Store...');
identities = await findIdentities(validatedOpts.keychain || null, '3rd Party Mac Developer Application:');
}
else {
debugLog('Finding `Mac Developer` certificate for signing app in development for the Mac App Store signing...');
identities = await findIdentities(validatedOpts.keychain || null, 'Mac Developer:');
}
}
else {
debugLog('Finding `Developer ID Application` certificate for distribution outside the Mac App Store...');
identities = await findIdentities(validatedOpts.keychain || null, 'Developer ID Application:');
}
}
if (!identityInUse) {
if (identities.length > 0) {
// Identity(/ies) found
if (identities.length > 1) {
debugWarn('Multiple identities found, will use the first discovered.');
}
else {
debugLog('Found 1 identity.');
}
identityInUse = identities[0];
}
else {
// No identity found
throw new Error('No identity found for signing.');
}
}
// Pre-sign operations
if (validatedOpts.preEmbedProvisioningProfile === false) {
debugWarn('Pre-sign operation disabled for provisioning profile embedding:', '\n', '* Enable by setting `pre-embed-provisioning-profile` to `true`.');
}
else {
debugLog('Pre-sign operation enabled for provisioning profile:', '\n', '* Disable by setting `pre-embed-provisioning-profile` to `false`.');
await preEmbedProvisioningProfile(validatedOpts, validatedOpts.provisioningProfile
? await getProvisioningProfile(validatedOpts.provisioningProfile, validatedOpts.keychain)
: null);
}
debugLog('Signing application...', '\n', '> Application:', validatedOpts.app, '\n', '> Platform:', validatedOpts.platform, '\n', '> Additional binaries:', validatedOpts.binaries, '\n', '> Identity:', validatedOpts.identity);
await signApplication(validatedOpts, identityInUse);
// Post-sign operations
debugLog('Application signed.');
}
/**
* This function is a legacy callback implementation.
*
* @deprecated Please use the Promise-based {@link signAsync} method instead.
* @category Codesign
*/
export const sign = (opts, cb) => {
signApp(opts)
.then(() => {
debugLog('Application signed: ' + opts.app);
if (cb)
cb();
})
.catch((err) => {
if (err.message)
debugLog(err.message);
else if (err.stack)
debugLog(err.stack);
else
debugLog(err);
if (cb)
cb(err);
});
};
//# sourceMappingURL=sign.js.map
File diff suppressed because one or more lines are too long
-258
View File
@@ -1,258 +0,0 @@
/**
* macOS applications can be distributed via the Mac App Store (MAS) or directly
* downloaded from the developer's website. @electron/osx-sign distinguishes between
* MAS apps (`mas`) or non-MAS apps (`darwin`).
* @category Utility
*/
export type ElectronMacPlatform = 'darwin' | 'mas';
/**
* MAS apps can be signed using Development or Distribution certificates.
* See [Apple Documentation](https://developer.apple.com/help/account/create-certificates/certificates-overview/) for more info.
* @category Utility
*/
export type SigningDistributionType = 'development' | 'distribution';
/**
* @interface
* @internal
*/
export type BaseSignOptions = Readonly<{
/**
* Path to the application package.
* Needs to end with the file extension `.app`.
*/
app: string;
/**
* The keychain name.
*
* @defaultValue `login`
*/
keychain?: string;
/**
* Build platform of your Electron app.
* Allowed values: `darwin` (Direct Download App), `mas` (Mac App Store).
*
* @defaultValue Determined by presence of `Squirrel.framework` within the application bundle,
* which is used for non-MAS apps.
*/
platform?: ElectronMacPlatform;
/**
* Name of the certificate to use when signing.
*
* @defaultValue Selected with respect to {@link SignOptions.provisioningProfile | provisioningProfile}
* and {@link SignOptions.platform | platform} from the selected {@link SignOptions.keychain | keychain}.
* * `mas` will look for `3rd Party Mac Developer Application: * (*)`
* * `darwin` will look for `Developer ID Application: * (*)` by default.
*/
identity?: string;
}>;
type OnlyValidatedBaseSignOptions = {
platform: ElectronMacPlatform;
};
/**
* A set of signing options that can be overriden on a per-file basis.
* Any missing options will use the default values, and providing a partial structure
* will shallow merge with the default values.
* @interface
* @category Codesign
*/
export type PerFileSignOptions = {
/**
* String specifying the path to an `entitlements.plist` file.
* Can also be an array of entitlement keys that osx-sign will write to an entitlements file for you.
*
* @defaultValue `@electron/osx-sign`'s built-in entitlements files.
*/
entitlements?: string | string[];
/**
* Whether to enable [Hardened Runtime](https://developer.apple.com/documentation/security/hardened_runtime)
* for this file.
*
* Note: Hardened Runtime is a pre-requisite for notarization, which is mandatory for apps running on macOS 10.15 and above.
*
* @defaultValue `true`
*/
hardenedRuntime?: boolean;
/**
* Either a string beginning with `=` which specifies in plain text the
* [signing requirements](https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/RequirementLang/RequirementLang.html)
* that you recommend to be used to evaluate the code signature, or a string specifying a path to a text or
* properly encoded `.rqset` file which contains those requirements.
*/
requirements?: string;
/**
* When signing, a set of option flags can be specified to change the behavior of the system when using the signed code.
* Accepts an array of strings or a comma-separated string.
*
* See --options of the `codesign` command.
*
* https://keith.github.io/xcode-man-pages/codesign.1.html#OPTION_FLAGS
*/
signatureFlags?: string | string[];
/**
* String specifying the URL of the timestamp authority server.
* Please note that this default server may not support signatures not furnished by Apple.
* Disable the timestamp service with `none`.
*
* @defaultValue Uses the Apple-provided timestamp server.
*/
timestamp?: string;
/**
* Additional raw arguments to pass to the `codesign` command.
*
* These can be things like `--deep` for instance when code signing specific resources that may
* require such arguments.
*
* https://keith.github.io/xcode-man-pages/codesign.1.html#OPTIONS
*/
additionalArguments?: string[];
};
/**
* @interface
* @internal
*/
export type OnlySignOptions = {
/**
* Array of paths to additional binaries that will be signed along with built-ins of Electron.
*
* @defaultValue `undefined`
*/
binaries?: string[];
/**
* Function that receives the path to a file and can return the entitlements to use for that file to override the default behavior. The
* object this function returns can include any of the following optional keys. Any properties that are returned **override** the default
* values that `@electron/osx-sign` generates. Any properties not returned use the default value.
*
* @param filePath Path to file
* @returns Override signing options
*/
optionsForFile?: (filePath: string) => PerFileSignOptions;
/**
* Flag to enable/disable validation for the signing identity.
* If enabled, the {@link SignOptions.identity | identity} provided
* will be validated in the {@link BaseSignOptions.keychain | keychain} specified.
*
* @defaultValue `true`
*/
identityValidation?: boolean;
/**
* Defines files that will be skipped during the code signing process.
* This property accepts a regex, function or an array of regexes and functions.
* Elements of other types are treated as `RegExp`.
*
* File paths matching a regex or returning a `true` value from a function will be ignored.
*
* @defaultValue `undefined`
*/
ignore?: string | string[] | ((file: string) => boolean);
/**
* Flag to enable/disable entitlements automation tasks necessary for code signing most Electron apps.
* * Adds [`com.apple.security.application-groups`](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_application-groups) to the entitlements file
* * Fills in the `ElectronTeamID` property in `Info.plist` with the provisioning profile's Team Identifier or by parsing the identity name.
*
* @defaultValue `true`
*/
preAutoEntitlements?: boolean;
/**
* Flag to enable/disable the embedding of a provisioning profile into the app's `Contents` folder.
* Will use the profile from {@link OnlySignOptions.provisioningProfile} if provided. Otherwise, it
* searches for a `.provisionprofile` file in the current working directory.
*
* @defaultValue `true`
*/
preEmbedProvisioningProfile?: boolean;
/**
* Path to a provisioning profile, which can be used to grant restricted entitlements to your app.
*
* See [Apple Documentation](https://developer.apple.com/documentation/technotes/tn3125-inside-code-signing-provisioning-profiles) for more details.
*/
provisioningProfile?: string;
/**
* Flag to enable/disable the `--strict` flag when verifying the signed application bundle.
* Also supports string values to specify which strict restrictions to use, see codesign man page for supported values.
*
* @defaultValue `true`
*/
strictVerify?: boolean | string;
/**
* Type of certificate to use when signing a MAS app.
* @defaultValue `"distribution"`
*/
type?: SigningDistributionType;
/**
* Build version of Electron. Values may be like: `1.1.1`, `1.2.0`. For use for signing legacy versions
* of Electron to ensure backwards compatibility.
*/
version?: string;
};
type OnlyValidatedSignOptions = {
ignore?: (string | ((file: string) => boolean))[];
type: SigningDistributionType;
};
type OnlyFlatOptions = {
/**
* Flag to enable/disable validation for the signing identity.
* If enabled, the {@link BaseSignOptions.identity | identity} provided
* will be validated in the {@link BaseSignOptions.keychain | keychain} specified.
*
* @defaultValue `true`
*/
identityValidation?: boolean;
/**
* Path to install the bundle.
* @defaultValue `"/Applications"`
*/
install?: string;
/**
* Output path for the flattened installer package.
* Needs file extension `.pkg`.
*
* @defaultValue Inferred from the app name passed into `opts.app`.
*/
pkg?: string;
/**
* Path to a directory containing `preinstall.sh` or `postinstall.sh` scripts.
* These must be executable and will run on pre/postinstall depending on the file
* name.
*
* This option is only valid if {@link FlatOptions.platform} is set to `darwin`.
*/
scripts?: string;
};
type OnlyValidatedFlatOptions = {
install: string;
pkg: string;
};
/**
* Utility type that represents an `UnValidated` type after validation,
* replacing any properties in the unvalidated type that also exist in the
* `Validated` type with the validated versions.
*
* @template UnValidated - The type representing the unvalidated form.
* @template Validated - The type representing the validated form.
*/
type ValidatedForm<UnValidated, Validated> = Omit<UnValidated, keyof Validated> & Validated;
type ValidatedBaseSignOptions = Readonly<ValidatedForm<BaseSignOptions, OnlyValidatedBaseSignOptions>>;
type _SignOptions = Readonly<OnlySignOptions & BaseSignOptions>;
/**
* Options for codesigning a packaged `.app` bundle.
* @category Codesign
*/
export interface SignOptions extends _SignOptions {
}
/**
* @internal
*/
export type ValidatedSignOptions = Readonly<ValidatedForm<OnlySignOptions, OnlyValidatedSignOptions> & ValidatedBaseSignOptions>;
type _FlatOptions = Readonly<OnlyFlatOptions & BaseSignOptions>;
/**
* Options for creating a flat `.pkg` installer.
* @category Flat
*/
export interface FlatOptions extends _FlatOptions {
}
/**
* @internal
*/
export type ValidatedFlatOptions = Readonly<ValidatedForm<OnlyFlatOptions, OnlyValidatedFlatOptions> & ValidatedBaseSignOptions>;
export {};
-2
View File
@@ -1,2 +0,0 @@
export {};
//# sourceMappingURL=types.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
-17
View File
@@ -1,17 +0,0 @@
import { PerFileSignOptions, ValidatedSignOptions } from './types';
import { Identity } from './util-identities';
import { ProvisioningProfile } from './util-provisioning-profiles';
type ComputedOptions = {
identity: Identity;
provisioningProfile?: ProvisioningProfile;
};
/**
* This function returns a promise completing the entitlements automation: The
* process includes checking in `Info.plist` for `ElectronTeamID` or setting
* parsed value from identity, and checking in entitlements file for
* `com.apple.security.application-groups` or inserting new into array. A
* temporary entitlements file may be created to replace the input for any
* changes introduced.
*/
export declare function preAutoEntitlements(opts: ValidatedSignOptions, perFileOpts: PerFileSignOptions, computed: ComputedOptions): Promise<void | string>;
export {};
-106
View File
@@ -1,106 +0,0 @@
import * as fs from 'fs-extra';
import * as os from 'os';
import * as path from 'path';
import * as plist from 'plist';
import { debugLog, getAppContentsPath } from './util';
const preAuthMemo = new Map();
/**
* This function returns a promise completing the entitlements automation: The
* process includes checking in `Info.plist` for `ElectronTeamID` or setting
* parsed value from identity, and checking in entitlements file for
* `com.apple.security.application-groups` or inserting new into array. A
* temporary entitlements file may be created to replace the input for any
* changes introduced.
*/
export async function preAutoEntitlements(opts, perFileOpts, computed) {
var _a;
if (!perFileOpts.entitlements)
return;
const memoKey = [opts.app, perFileOpts.entitlements].join('---');
if (preAuthMemo.has(memoKey))
return preAuthMemo.get(memoKey);
// If entitlements file not provided, default will be used. Fixes #41
const appInfoPath = path.join(getAppContentsPath(opts), 'Info.plist');
debugLog('Automating entitlement app group...', '\n', '> Info.plist:', appInfoPath, '\n');
let entitlements;
if (typeof perFileOpts.entitlements === 'string') {
const entitlementsContents = await fs.readFile(perFileOpts.entitlements, 'utf8');
entitlements = plist.parse(entitlementsContents);
}
else {
entitlements = perFileOpts.entitlements.reduce((dict, entitlementKey) => (Object.assign(Object.assign({}, dict), { [entitlementKey]: true })), {});
}
if (!entitlements['com.apple.security.app-sandbox']) {
// Only automate when app sandbox enabled by user
return;
}
const appInfoContents = await fs.readFile(appInfoPath, 'utf8');
const appInfo = plist.parse(appInfoContents);
// Use ElectronTeamID in Info.plist if already specified
if (appInfo.ElectronTeamID) {
debugLog('`ElectronTeamID` found in `Info.plist`: ' + appInfo.ElectronTeamID);
}
else {
// The team identifier in signing identity should not be trusted
if (computed.provisioningProfile) {
appInfo.ElectronTeamID =
computed.provisioningProfile.message.Entitlements['com.apple.developer.team-identifier'];
debugLog('`ElectronTeamID` not found in `Info.plist`, use parsed from provisioning profile: ' +
appInfo.ElectronTeamID);
}
else {
const teamID = (_a = /^.+\((.+?)\)$/g.exec(computed.identity.name)) === null || _a === void 0 ? void 0 : _a[1];
if (!teamID) {
throw new Error(`Could not automatically determine ElectronTeamID from identity: ${computed.identity.name}`);
}
appInfo.ElectronTeamID = teamID;
debugLog('`ElectronTeamID` not found in `Info.plist`, use parsed from signing identity: ' +
appInfo.ElectronTeamID);
}
await fs.writeFile(appInfoPath, plist.build(appInfo), 'utf8');
debugLog('`Info.plist` updated:', '\n', '> Info.plist:', appInfoPath);
}
const appIdentifier = appInfo.ElectronTeamID + '.' + appInfo.CFBundleIdentifier;
// Insert application identifier if not exists
if (entitlements['com.apple.application-identifier']) {
debugLog('`com.apple.application-identifier` found in entitlements file: ' +
entitlements['com.apple.application-identifier']);
}
else {
debugLog('`com.apple.application-identifier` not found in entitlements file, new inserted: ' +
appIdentifier);
entitlements['com.apple.application-identifier'] = appIdentifier;
}
// Insert developer team identifier if not exists
if (entitlements['com.apple.developer.team-identifier']) {
debugLog('`com.apple.developer.team-identifier` found in entitlements file: ' +
entitlements['com.apple.developer.team-identifier']);
}
else {
debugLog('`com.apple.developer.team-identifier` not found in entitlements file, new inserted: ' +
appInfo.ElectronTeamID);
entitlements['com.apple.developer.team-identifier'] = appInfo.ElectronTeamID;
}
// Init entitlements app group key to array if not exists
if (!entitlements['com.apple.security.application-groups']) {
entitlements['com.apple.security.application-groups'] = [];
}
// Insert app group if not exists
if (Array.isArray(entitlements['com.apple.security.application-groups']) &&
entitlements['com.apple.security.application-groups'].indexOf(appIdentifier) === -1) {
debugLog('`com.apple.security.application-groups` not found in entitlements file, new inserted: ' +
appIdentifier);
entitlements['com.apple.security.application-groups'].push(appIdentifier);
}
else {
debugLog('`com.apple.security.application-groups` found in entitlements file: ' + appIdentifier);
}
// Create temporary entitlements file
const dir = await fs.mkdtemp(path.resolve(os.tmpdir(), 'tmp-entitlements-'));
const entitlementsPath = path.join(dir, 'entitlements.plist');
await fs.writeFile(entitlementsPath, plist.build(entitlements), 'utf8');
debugLog('Entitlements file updated:', '\n', '> Entitlements:', entitlementsPath);
preAuthMemo.set(memoKey, entitlementsPath);
return entitlementsPath;
}
//# sourceMappingURL=util-entitlements.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"util-entitlements.js","sourceRoot":"","sources":["../../src/util-entitlements.ts"],"names":[],"mappings":"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"}
-6
View File
@@ -1,6 +0,0 @@
export declare class Identity {
name: string;
hash?: string | undefined;
constructor(name: string, hash?: string | undefined);
}
export declare function findIdentities(keychain: string | null, identity: string): Promise<Identity[]>;
-30
View File
@@ -1,30 +0,0 @@
import { debugLog, compactFlattenedList, execFileAsync } from './util';
export class Identity {
constructor(name, hash) {
this.name = name;
this.hash = hash;
}
}
export async function findIdentities(keychain, identity) {
// Only to look for valid identities, excluding those flagged with
// CSSMERR_TP_CERT_EXPIRED or CSSMERR_TP_NOT_TRUSTED. Fixes #9
const args = [
'find-identity',
'-v'
];
if (keychain) {
args.push(keychain);
}
const result = await execFileAsync('security', args);
const identities = result.split('\n').map(function (line) {
if (line.indexOf(identity) >= 0) {
const identityFound = line.substring(line.indexOf('"') + 1, line.lastIndexOf('"'));
const identityHashFound = line.substring(line.indexOf(')') + 2, line.indexOf('"') - 1);
debugLog('Identity:', '\n', '> Name:', identityFound, '\n', '> Hash:', identityHashFound);
return new Identity(identityFound, identityHashFound);
}
return null;
});
return compactFlattenedList(identities);
}
//# sourceMappingURL=util-identities.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"util-identities.js","sourceRoot":"","sources":["../../src/util-identities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvE,MAAM,OAAO,QAAQ;IACnB,YAAoB,IAAY,EAAS,IAAa;QAAlC,SAAI,GAAJ,IAAI,CAAQ;QAAS,SAAI,GAAJ,IAAI,CAAS;IAAG,CAAC;CAC3D;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAE,QAAuB,EAAE,QAAgB;IAC7E,kEAAkE;IAClE,8DAA8D;IAE9D,MAAM,IAAI,GAAG;QACX,eAAe;QACf,IAAI;KACL,CAAC;IACF,IAAI,QAAQ,EAAE;QACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACrB;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI;QACtD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACnF,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACvF,QAAQ,CAAC,WAAW,EAAE,IAAI,EACxB,SAAS,EAAE,aAAa,EAAE,IAAI,EAC9B,SAAS,EAAE,iBAAiB,CAAC,CAAC;YAChC,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;SACvD;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,oBAAoB,CAAC,UAAU,CAAC,CAAC;AAC1C,CAAC"}
@@ -1,25 +0,0 @@
import { ElectronMacPlatform, ValidatedSignOptions } from './types';
export declare class ProvisioningProfile {
filePath: string;
message: any;
constructor(filePath: string, message: any);
get name(): string;
get platforms(): ElectronMacPlatform[];
get type(): "development" | "distribution";
}
/**
* Returns a promise resolving to a ProvisioningProfile instance based on file.
* @function
* @param {string} filePath - Path to provisioning profile.
* @param {string} keychain - Keychain to use when unlocking provisioning profile.
* @returns {Promise} Promise.
*/
export declare function getProvisioningProfile(filePath: string, keychain?: string | null): Promise<ProvisioningProfile>;
/**
* Returns a promise resolving to a list of suitable provisioning profile within the current working directory.
*/
export declare function findProvisioningProfiles(opts: ValidatedSignOptions): Promise<ProvisioningProfile[]>;
/**
* Returns a promise embedding the provisioning profile in the app Contents folder.
*/
export declare function preEmbedProvisioningProfile(opts: ValidatedSignOptions, profile: ProvisioningProfile | null): Promise<void>;
-115
View File
@@ -1,115 +0,0 @@
import * as fs from 'fs-extra';
import * as path from 'path';
import plist from 'plist';
import { debugLog, debugWarn, getAppContentsPath, compactFlattenedList, execFileAsync } from './util';
export class ProvisioningProfile {
constructor(filePath, message) {
this.filePath = filePath;
this.message = message;
}
get name() {
return this.message.Name;
}
get platforms() {
if ('ProvisionsAllDevices' in this.message)
return ['darwin'];
// Developer ID
else if (this.type === 'distribution')
return ['mas'];
// Mac App Store
else
return ['darwin', 'mas']; // Mac App Development
}
get type() {
if ('ProvisionedDevices' in this.message)
return 'development';
// Mac App Development
else
return 'distribution'; // Developer ID or Mac App Store
}
}
/**
* Returns a promise resolving to a ProvisioningProfile instance based on file.
* @function
* @param {string} filePath - Path to provisioning profile.
* @param {string} keychain - Keychain to use when unlocking provisioning profile.
* @returns {Promise} Promise.
*/
export async function getProvisioningProfile(filePath, keychain = null) {
const securityArgs = [
'cms',
'-D',
'-i',
filePath // Use infile as source of data
];
if (keychain) {
securityArgs.push('-k', keychain);
}
const result = await execFileAsync('security', securityArgs);
const provisioningProfile = new ProvisioningProfile(filePath, plist.parse(result));
debugLog('Provisioning profile:', '\n', '> Name:', provisioningProfile.name, '\n', '> Platforms:', provisioningProfile.platforms, '\n', '> Type:', provisioningProfile.type, '\n', '> Path:', provisioningProfile.filePath, '\n', '> Message:', provisioningProfile.message);
return provisioningProfile;
}
/**
* Returns a promise resolving to a list of suitable provisioning profile within the current working directory.
*/
export async function findProvisioningProfiles(opts) {
const cwd = process.cwd();
const children = await fs.readdir(cwd);
const foundProfiles = compactFlattenedList(await Promise.all(children.map(async (child) => {
const filePath = path.resolve(cwd, child);
const stat = await fs.stat(filePath);
if (stat.isFile() && path.extname(filePath) === '.provisionprofile') {
return filePath;
}
return null;
})));
return compactFlattenedList(await Promise.all(foundProfiles.map(async (filePath) => {
const profile = await getProvisioningProfile(filePath);
if (profile.platforms.indexOf(opts.platform) >= 0 && profile.type === opts.type) {
return profile;
}
debugWarn('Provisioning profile above ignored, not for ' + opts.platform + ' ' + opts.type + '.');
return null;
})));
}
/**
* Returns a promise embedding the provisioning profile in the app Contents folder.
*/
export async function preEmbedProvisioningProfile(opts, profile) {
async function embedProvisioningProfile(profile) {
debugLog('Looking for existing provisioning profile...');
const embeddedFilePath = path.join(getAppContentsPath(opts), 'embedded.provisionprofile');
if (await fs.pathExists(embeddedFilePath)) {
debugLog('Found embedded provisioning profile:', '\n', '* Please manually remove the existing file if not wanted.', '\n', '* Current file at:', embeddedFilePath);
}
else {
debugLog('Embedding provisioning profile...');
await fs.copy(profile.filePath, embeddedFilePath);
}
}
if (profile) {
// User input provisioning profile
return await embedProvisioningProfile(profile);
}
else {
// Discover provisioning profile
debugLog('No `provisioning-profile` passed in arguments, will find in current working directory and in user library...');
const profiles = await findProvisioningProfiles(opts);
if (profiles.length > 0) {
// Provisioning profile(s) found
if (profiles.length > 1) {
debugLog('Multiple provisioning profiles found, will use the first discovered.');
}
else {
debugLog('Found 1 provisioning profile.');
}
await embedProvisioningProfile(profiles[0]);
}
else {
// No provisioning profile found
debugLog('No provisioning profile found, will not embed profile in app contents.');
}
}
}
//# sourceMappingURL=util-provisioning-profiles.js.map
@@ -1 +0,0 @@
{"version":3,"file":"util-provisioning-profiles.js","sourceRoot":"","sources":["../../src/util-provisioning-profiles.ts"],"names":[],"mappings":"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"}
-36
View File
@@ -1,36 +0,0 @@
/// <reference types="node" />
import * as child from 'child_process';
import debug from 'debug';
import { BaseSignOptions, ElectronMacPlatform } from './types';
export declare const debugLog: debug.Debugger;
export declare const debugWarn: debug.Debugger;
export declare function execFileAsync(file: string, args: string[], options?: child.ExecFileOptions): Promise<string>;
type DeepListItem<T> = null | T | DeepListItem<T>[];
type DeepList<T> = DeepListItem<T>[];
export declare function compactFlattenedList<T>(list: DeepList<T>): T[];
/**
* Returns the path to the "Contents" folder inside the application bundle
*/
export declare function getAppContentsPath(opts: BaseSignOptions): string;
/**
* Returns the path to app "Frameworks" within contents.
*/
export declare function getAppFrameworksPath(opts: BaseSignOptions): string;
export declare function detectElectronPlatform(opts: BaseSignOptions): Promise<ElectronMacPlatform>;
/**
* This function returns a promise validating opts.app, the application to be signed or flattened.
*/
export declare function validateOptsApp(opts: BaseSignOptions): Promise<void>;
/**
* This function returns a promise validating opts.platform, the platform of Electron build. It allows auto-discovery if no opts.platform is specified.
*/
export declare function validateOptsPlatform(opts: BaseSignOptions): Promise<ElectronMacPlatform>;
/**
* This function returns a promise resolving all child paths within the directory specified.
* @function
* @param {string} dirPath - Path to directory.
* @returns {Promise} Promise resolving child paths needing signing in order.
* @internal
*/
export declare function walkAsync(dirPath: string): Promise<string[]>;
export {};
-146
View File
@@ -1,146 +0,0 @@
import * as child from 'child_process';
import * as fs from 'fs-extra';
import { isBinaryFile } from 'isbinaryfile';
import * as path from 'path';
import debug from 'debug';
export const debugLog = debug('electron-osx-sign');
debugLog.log = console.log.bind(console);
export const debugWarn = debug('electron-osx-sign:warn');
debugWarn.log = console.warn.bind(console);
const removePassword = function (input) {
return input.replace(/(-P |pass:|\/p|-pass )([^ ]+)/, function (_, p1) {
return `${p1}***`;
});
};
export async function execFileAsync(file, args, options = {}) {
if (debugLog.enabled) {
debugLog('Executing...', file, args && Array.isArray(args) ? removePassword(args.join(' ')) : '');
}
return new Promise(function (resolve, reject) {
child.execFile(file, args, options, function (err, stdout, stderr) {
if (err) {
debugLog('Error executing file:', '\n', '> Stdout:', stdout, '\n', '> Stderr:', stderr);
reject(err);
return;
}
resolve(stdout);
});
});
}
export function compactFlattenedList(list) {
const result = [];
function populateResult(list) {
if (!Array.isArray(list)) {
if (list)
result.push(list);
}
else if (list.length > 0) {
for (const item of list)
if (item)
populateResult(item);
}
}
populateResult(list);
return result;
}
/**
* Returns the path to the "Contents" folder inside the application bundle
*/
export function getAppContentsPath(opts) {
return path.join(opts.app, 'Contents');
}
/**
* Returns the path to app "Frameworks" within contents.
*/
export function getAppFrameworksPath(opts) {
return path.join(getAppContentsPath(opts), 'Frameworks');
}
export async function detectElectronPlatform(opts) {
const appFrameworksPath = getAppFrameworksPath(opts);
if (await fs.pathExists(path.resolve(appFrameworksPath, 'Squirrel.framework'))) {
return 'darwin';
}
else {
return 'mas';
}
}
/**
* This function returns a promise resolving the file path if file binary.
*/
async function getFilePathIfBinary(filePath) {
if (await isBinaryFile(filePath)) {
return filePath;
}
return null;
}
/**
* This function returns a promise validating opts.app, the application to be signed or flattened.
*/
export async function validateOptsApp(opts) {
if (!opts.app) {
throw new Error('Path to application must be specified.');
}
if (path.extname(opts.app) !== '.app') {
throw new Error('Extension of application must be `.app`.');
}
if (!(await fs.pathExists(opts.app))) {
throw new Error(`Application at path "${opts.app}" could not be found`);
}
}
/**
* This function returns a promise validating opts.platform, the platform of Electron build. It allows auto-discovery if no opts.platform is specified.
*/
export async function validateOptsPlatform(opts) {
if (opts.platform) {
if (opts.platform === 'mas' || opts.platform === 'darwin') {
return opts.platform;
}
else {
debugWarn('`platform` passed in arguments not supported, checking Electron platform...');
}
}
else {
debugWarn('No `platform` passed in arguments, checking Electron platform...');
}
return await detectElectronPlatform(opts);
}
/**
* This function returns a promise resolving all child paths within the directory specified.
* @function
* @param {string} dirPath - Path to directory.
* @returns {Promise} Promise resolving child paths needing signing in order.
* @internal
*/
export async function walkAsync(dirPath) {
debugLog('Walking... ' + dirPath);
async function _walkAsync(dirPath) {
const children = await fs.readdir(dirPath);
return await Promise.all(children.map(async (child) => {
const filePath = path.resolve(dirPath, child);
const stat = await fs.stat(filePath);
if (stat.isFile()) {
switch (path.extname(filePath)) {
case '.cstemp': // Temporary file generated from past codesign
debugLog('Removing... ' + filePath);
await fs.remove(filePath);
return null;
default:
return await getFilePathIfBinary(filePath);
}
}
else if (stat.isDirectory() && !stat.isSymbolicLink()) {
const walkResult = await _walkAsync(filePath);
switch (path.extname(filePath)) {
case '.app': // Application
case '.framework': // Framework
walkResult.push(filePath);
}
return walkResult;
}
return null;
}));
}
const allPaths = await _walkAsync(dirPath);
return compactFlattenedList(allPaths);
}
//# sourceMappingURL=util.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-jit</key>
<true/>
</dict>
</plist>
-20
View File
@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.bluetooth</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.device.print</key>
<true/>
<key>com.apple.security.device.usb</key>
<true/>
<key>com.apple.security.personal-information.location</key>
<true/>
</dict>
</plist>
@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
</dict>
</plist>
@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-jit</key>
<true/>
</dict>
</plist>
-10
View File
@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.inherit</key>
<true/>
</dict>
</plist>
-22
View File
@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
<key>com.apple.security.files.bookmarks.app-scope</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.print</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.device.microphone</key>
<true/>
<key>com.apple.security.device.usb</key>
<true/>
</dict>
</plist>
-80
View File
@@ -1,80 +0,0 @@
{
"name": "@electron/osx-sign",
"version": "1.3.3",
"description": "Codesign Electron macOS apps",
"main": "dist/cjs/index.js",
"module": "dist/esm/index.js",
"files": [
"dist",
"entitlements",
"README.md",
"LICENSE",
"bin"
],
"bin": {
"electron-osx-flat": "bin/electron-osx-flat.js",
"electron-osx-sign": "bin/electron-osx-sign.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/electron/osx-sign.git"
},
"author": "electron",
"license": "BSD-2-Clause",
"publishConfig": {
"provenance": true
},
"bugs": {
"url": "https://github.com/electron/osx-sign/issues"
},
"homepage": "https://github.com/electron/osx-sign",
"dependencies": {
"compare-version": "^0.1.2",
"debug": "^4.3.4",
"fs-extra": "^10.0.0",
"isbinaryfile": "^4.0.8",
"minimist": "^1.2.6",
"plist": "^3.0.5"
},
"devDependencies": {
"@electron/get": "^2.0.2",
"@types/compare-version": "^0.1.31",
"@types/debug": "^4.1.7",
"@types/fs-extra": "^9.0.13",
"@types/node": "^16.11.6",
"@types/plist": "^3.0.2",
"@typescript-eslint/eslint-plugin": "^5.45.0",
"@typescript-eslint/parser": "^5.45.0",
"eslint": "^8.29.0",
"eslint-config-eslint": "^7.0.0",
"eslint-config-standard": "^17.0.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^6.1.1",
"extract-zip": "^2.0.1",
"mkdirp": "^1.0.4",
"rimraf": "^3.0.2",
"run-series": "^1.1.9",
"run-waterfall": "^1.1.7",
"standard": "^17.0.0",
"tape": "^4.7.1",
"typedoc": "~0.25.13",
"typescript": "^4.9.3"
},
"scripts": {
"build": "tsc && tsc -p tsconfig.esm.json",
"docs:build": "npx typedoc",
"lint": "eslint --ext .ts,.js src bin test",
"pretest": "rimraf test/work",
"test": "yarn lint && tape test",
"prepublishOnly": "yarn build"
},
"standard": {
"ignore": [
"test/work"
]
},
"engines": {
"node": ">=12.0.0"
}
}
-21
View File
@@ -1,21 +0,0 @@
MIT License
Copyright (c) Contributors to the Electron project
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-202
View File
@@ -1,202 +0,0 @@
# @electron/rebuild
[![Test](https://github.com/electron/rebuild/actions/workflows/test.yml/badge.svg)](https://github.com/electron/rebuild/actions/workflows/test.yml)
[![NPM](https://img.shields.io/npm/v/@electron/rebuild.svg?style=flat)](https://npm.im/@electron/rebuild)
[![Coverage Status](https://codecov.io/gh/electron/rebuild/branch/main/graph/badge.svg)](https://codecov.io/gh/electron/rebuild)
[![API docs](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fregistry.npmjs.org%2F%40electron%2Frebuild%2Flatest&query=%24.version&logo=typescript&logoColor=white&label=API%20Docs)](https://packages.electronjs.org/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 v22.12.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:
-v, --version The version of Electron to build against [string]
-f, --force Force rebuilding modules, even if we would skip
it otherwise [boolean]
-a, --arch Override the target architecture to something
other than your system's [string]
-m, --module-dir The path to the node_modules directory to rebuild
[string]
-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). [string]
-o, --only Only build specified module, or comma separated
list of modules. All others are ignored. [string]
-e, --electron-prebuilt-dir The path to the prebuilt electron module [string]
-d, --dist-url Custom header tarball URL [string]
-t, --types The types of dependencies to rebuild. Comma
separated list of "prod", "dev" and "optional".
Default is "prod,optional" [string]
-p, --parallel Rebuild in parallel, this is enabled by default
on macOS and Linux [boolean]
-s, --sequential Rebuild modules sequentially, this is enabled by
default on Windows [boolean]
-b, --debug Build debug version of modules [boolean]
-j, --jobs Number of parallel compile jobs node-gyp should
run (passed as node-gyp --jobs). Defaults to
node-gyp's own default. [number]
--prebuild-tag-prefix GitHub tag prefix passed to prebuild-install.
Default is "v" [string]
--force-abi Override the ABI version for the version of
Electron you are targeting. Only use when
targeting Nightly releases. [number]
--use-electron-clang Use the clang executable that Electron used when
building its binary. This will guarantee compiler
compatibility [boolean]
--disable-pre-gyp-copy Disables the pre-gyp copy step [boolean]
--build-from-source Skips prebuild download and rebuilds module from
source. [boolean]
-h, --help Show help [boolean]
```
> [!NOTE]
> The `--dist-url` value can also be provided via the `ELECTRON_REBUILD_DIST_URL`
> environment variable. The `--dist-url` flag takes precedence when both are set.
> [!NOTE]
> By default, only your `prod` and `optional` dependencies are rebuilt —
> `devDependencies` are **not** rebuilt. This is because the default value of
> `types` is `['prod', 'optional']`. If you have a native module in your
> `devDependencies` that you need rebuilt, you must explicitly include `dev` in
> the list of types:
>
> - CLI: `electron-rebuild --types prod,optional,dev` (or `-t prod,optional,dev`)
> - API: `rebuild({ ..., types: ['prod', 'optional', 'dev'] })`
### How can I use this with [Electron Forge](https://github.com/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/packager)?
electron-rebuild provides a function compatible with the [`afterCopy` hook](https://packages.electronjs.org/packager/v19.0.5/interfaces/Options.html#aftercopy)
for Electron Packager. For example:
```javascript
import { packager } from "@electron/packager";
import { rebuild } from "@electron/rebuild";
packager({
// … other options
afterCopy: [
async ({ buildPath, electronVersion, arch }) => {
await rebuild({ buildPath, electronVersion, arch });
},
],
// … 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 my build pipeline?
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
```
For full API usage, see the [API documentation](https://packages.electronjs.org/rebuild).
A full build process might look something like:
```javascript
// ESM
import { rebuild } from "@electron/rebuild";
rebuild({
buildPath: import.meta.dirname,
electronVersion: "35.1.5",
})
.then(() => console.info("Rebuild Successful"))
.catch((e) => {
console.error("Building modules didn't work!");
console.error(e);
});
// CommonJS
const { rebuild } = require("@electron/rebuild");
rebuild({
buildPath: __dirname,
electronVersion: "35.1.5",
})
.then(() => console.info("Rebuild Successful"))
.catch((e) => {
console.error("Building modules didn't work!");
console.error(e);
});
```
-16
View File
@@ -1,16 +0,0 @@
/**
* Runs the `uname` command and returns the trimmed output.
*
* Copied from `@electron/get`.
*/
export declare function uname(): string;
export 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;
-29
View File
@@ -1,29 +0,0 @@
import { execSync } from 'node:child_process';
/**
* Runs the `uname` command and returns the trimmed output.
*
* Copied from `@electron/get`.
*/
export function uname() {
return execSync('uname -m').toString().trim();
}
/**
* Generates an architecture name that would be used in an Electron or Node.js
* download file name.
*
* Copied from `@electron/get`.
*/
export 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;
}
//# sourceMappingURL=arch.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"arch.js","sourceRoot":"","sources":["../src/arch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,UAAU,KAAK;IACnB,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC;AAMD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,eAAgC;IACxE,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,8DAA8D;QAC9D,QAAQ,eAAe,CAAC,WAAW,EAAE,CAAC;YACpC,KAAK,GAAG;gBACN,OAAO,KAAK,EAAE,CAAC;YACjB,KAAK,GAAG,CAAC;YACT;gBACE,OAAO,QAAQ,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
-14
View File
@@ -1,14 +0,0 @@
type CacheOptions = {
ABI: string;
arch: string;
platform: string;
debug: boolean;
electronVersion: string;
headerURL: string;
modulePath: string;
};
export declare const cacheModuleState: (dir: string, cachePath: string, key: string) => Promise<void>;
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 {};
-153
View File
@@ -1,153 +0,0 @@
import crypto from 'node:crypto';
import debug from 'debug';
import fs from 'node:fs';
import path from 'node:path';
import zlib from 'node:zlib';
const d = debug('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 {
hash;
data;
constructor(hash, data) {
this.hash = hash;
this.data = data;
}
}
const takeSnapshot = async (dir, relativeTo = dir) => {
const snap = {};
await Promise.all((await fs.promises.readdir(dir)).map(async (child) => {
if (child === 'node_modules')
return;
const childPath = path.resolve(dir, child);
const relative = path.relative(relativeTo, childPath);
if ((await fs.promises.stat(childPath)).isDirectory()) {
snap[relative] = await takeSnapshot(childPath, relativeTo);
}
else {
const data = await fs.promises.readFile(childPath);
snap[relative] = new Snap(crypto.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.promises.mkdir(path.dirname(path.resolve(dir, key)), { recursive: true });
await fs.promises.writeFile(path.resolve(dir, key), diff[key].data);
}
else {
await fs.promises.mkdir(path.resolve(dir, key), { recursive: true });
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;
};
export 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.gzip(moduleBuffer, (_, result) => resolve(result)));
await fs.promises.mkdir(cachePath, { recursive: true });
await fs.promises.writeFile(path.resolve(cachePath, key), zipped);
};
export const lookupModuleState = async (cachePath, key) => {
if (fs.existsSync(path.resolve(cachePath, key))) {
return async function applyDiff(dir) {
const zipped = await fs.promises.readFile(path.resolve(cachePath, key));
const unzipped = await new Promise((resolve) => {
zlib.gunzip(zipped, (_, result) => resolve(result));
});
const diff = unserialize(JSON.parse(unzipped.toString()));
await writeSnapshot(diff, dir);
};
}
return false;
};
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 ??= dir;
d('hashing dir', dir);
const dirTree = {};
await Promise.all((await fs.promises.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.resolve(dir, child);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const relative = path.relative(relativeTo, childPath);
if ((await fs.promises.stat(childPath)).isDirectory()) {
dirTree[relative] = await hashDirectory(childPath, relativeTo);
}
else {
dirTree[relative] = crypto
.createHash('SHA256')
.update(await fs.promises.readFile(childPath))
.digest('hex');
}
}));
return dirTree;
}
export async function generateCacheKey(opts) {
const tree = await hashDirectory(opts.modulePath);
const hasher = crypto
.createHash('SHA256')
.update(`${ELECTRON_REBUILD_CACHE_ID}`)
.update(path.basename(opts.modulePath))
.update(opts.ABI)
.update(opts.arch)
.update(opts.platform)
.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;
}
//# sourceMappingURL=cache.js.map
File diff suppressed because one or more lines are too long
-4
View File
@@ -1,4 +0,0 @@
export declare function getClangEnvironmentVars(electronVersion: string, targetArch: string): Promise<{
env: Record<string, string>;
args: string[];
}>;
-105
View File
@@ -1,105 +0,0 @@
import cp from 'node:child_process';
import debug from 'debug';
import fs from 'node:fs';
import path from 'node:path';
import { ELECTRON_GYP_DIR } from './constants.js';
import { fetchUrl } from './fetcher.js';
import { downloadLinuxSysroot } from './sysroot-fetcher.js';
import { spawn } from '@malept/cross-spawn-promise';
const d = debug('electron-rebuild');
const CDS_URL = 'https://commondatastorage.googleapis.com/chromium-browser-clang';
function getPlatformUrlPrefix(hostOS, hostArch) {
const prefixMap = {
linux: 'Linux_x64',
darwin: 'Mac',
win32: 'Win',
};
let prefix = prefixMap[hostOS];
if (prefix === 'Mac' && hostArch === 'arm64') {
prefix = 'Mac_arm64';
}
return CDS_URL + '/' + prefix + '/';
}
function getClangDownloadURL(packageFile, packageVersion, hostOS, hostArch) {
const cdsFile = `${packageFile}-${packageVersion}.tgz`;
return getPlatformUrlPrefix(hostOS, hostArch) + 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();
}
export async function getClangEnvironmentVars(electronVersion, targetArch) {
const clangDownloadDir = await downloadClangVersion(electronVersion);
const clangDir = path.resolve(clangDownloadDir, 'bin');
const clangArgs = [];
if (process.platform === 'darwin') {
clangArgs.push('-isysroot', getSDKRoot());
}
const gypArgs = [];
if (process.platform === 'win32') {
console.log(await fs.promises.readdir(clangDir));
gypArgs.push(`/p:CLToolExe=clang-cl.exe`, `/p:CLToolPath=${clangDir}`);
}
if (process.platform === 'linux') {
const sysrootPath = await downloadLinuxSysroot(electronVersion, targetArch);
clangArgs.push('--sysroot', sysrootPath);
}
return {
env: {
CC: `"${path.resolve(clangDir, 'clang')}" ${clangArgs.join(' ')}`,
CXX: `"${path.resolve(clangDir, 'clang++')}" ${clangArgs.join(' ')}`,
},
args: gypArgs,
};
}
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(ELECTRON_GYP_DIR, `${electronVersion}-clang`);
if (fs.existsSync(path.resolve(clangDirPath, 'bin', 'clang')))
return clangDirPath;
await fs.promises.mkdir(ELECTRON_GYP_DIR, { recursive: true });
const electronDeps = await fetchUrl(`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 fetchUrl(`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, process.arch);
const contents = await fetchUrl(clangDownloadURL, 'buffer');
const tarPath = path.resolve(ELECTRON_GYP_DIR, `${electronVersion}-clang.tgz`);
if (fs.existsSync(tarPath))
await fs.promises.rm(tarPath, { recursive: true, force: true });
await fs.promises.writeFile(tarPath, contents);
await fs.promises.mkdir(clangDirPath, { recursive: true });
d('extracting clang');
await spawn('tar', ['-xf', tarPath, '-C', clangDirPath], { stdio: 'ignore' });
await fs.promises.rm(tarPath, { recursive: true, force: true });
d('cleaning up clang tar file');
return clangDirPath;
}
//# sourceMappingURL=clang-fetcher.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"clang-fetcher.js","sourceRoot":"","sources":["../src/clang-fetcher.ts"],"names":[],"mappings":"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"}
-2
View File
@@ -1,2 +0,0 @@
#!/usr/bin/env node
export {};
-198
View File
@@ -1,198 +0,0 @@
#!/usr/bin/env node
import fs from 'node:fs';
import path from 'node:path';
import { parseArgs, styleText } from 'node:util';
import { pathToFileURL } from 'node:url';
import { getProjectRootPath } from './search-module.js';
import { locateElectronModule } from './electron-locator.js';
import { rebuild } from './rebuild.js';
const options = {
version: { short: 'v', type: 'string', description: 'The version of Electron to build against' },
force: {
short: 'f',
type: 'boolean',
description: 'Force rebuilding modules, even if we would skip it otherwise',
},
arch: {
short: 'a',
type: 'string',
description: "Override the target architecture to something other than your system's",
},
platform: {
type: 'string',
description: "Override the target platform to something other than your system's",
},
'module-dir': {
short: 'm',
type: 'string',
description: 'The path to the node_modules directory to rebuild',
},
'which-module': {
short: '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).',
},
only: {
short: 'o',
type: 'string',
description: 'Only build specified module, or comma separated list of modules. All others are ignored.',
},
'electron-prebuilt-dir': {
short: 'e',
type: 'string',
description: 'The path to the prebuilt electron module',
},
'dist-url': {
short: 'd',
type: 'string',
description: 'Custom header tarball URL. Can also be set via the ELECTRON_REBUILD_DIST_URL environment variable.',
},
types: {
short: 't',
type: 'string',
description: 'The types of dependencies to rebuild. Comma separated list of "prod", "dev" and "optional". Default is "prod,optional"',
},
parallel: {
short: 'p',
type: 'boolean',
description: 'Rebuild in parallel, this is enabled by default on macOS and Linux',
},
sequential: {
short: 's',
type: 'boolean',
description: 'Rebuild modules sequentially, this is enabled by default on Windows',
},
debug: { short: 'b', type: 'boolean', description: 'Build debug version of modules' },
jobs: {
short: 'j',
type: 'string',
description: "Number of parallel compile jobs node-gyp should run (passed as node-gyp --jobs). Defaults to node-gyp's own default.",
},
'prebuild-tag-prefix': {
type: 'string',
description: 'GitHub tag prefix passed to prebuild-install. Default is "v"',
},
'force-abi': {
type: 'string',
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' },
'build-from-source': {
type: 'boolean',
description: 'Skips prebuild download and rebuilds module from source.',
},
help: { short: 'h', type: 'boolean', description: 'Show help' },
};
const { values: argv } = parseArgs({ options, allowPositionals: true });
if (argv.help) {
console.log('Usage: electron-rebuild --version [version] --module-dir [path]\n\nOptions:');
for (const [name, opt] of Object.entries(options)) {
const short = 'short' in opt ? `-${opt.short}, ` : ' ';
console.log(` ${short}--${name.padEnd(22)} ${opt.description}`);
}
process.exit(0);
}
if (process.argv.length === 3 && process.argv[2] === '--version') {
try {
console.log('Electron Rebuild Version:', (await import(pathToFileURL(path.resolve(import.meta.dirname, '../../package.json')).toString(), { with: { type: 'json' } })).default.version);
}
catch {
console.log('Electron Rebuild Version:', (await import(pathToFileURL(path.resolve(import.meta.dirname, '../package.json')).toString(), { with: { type: 'json' } })).default.version);
}
process.exit(0);
}
const handler = (err) => {
console.error(styleText('red', '\nAn unhandled error occurred inside electron-rebuild'));
console.error(styleText('red', `${err.message}\n\n${err.stack}`));
process.exit(-1);
};
process.on('uncaughtException', handler);
process.on('unhandledRejection', handler);
void (async () => {
const projectRootPath = await getProjectRootPath(process.cwd());
const electronModulePath = argv['electron-prebuilt-dir']
? path.resolve(process.cwd(), argv['electron-prebuilt-dir'])
: await locateElectronModule(projectRootPath);
let electronModuleVersion = argv.version;
if (!electronModuleVersion) {
try {
if (!electronModulePath)
throw new Error('Prebuilt electron module not found');
const pkgJson = await import(pathToFileURL(path.join(electronModulePath, 'package.json')).toString(), { with: { type: 'json' } });
electronModuleVersion = pkgJson.default.version;
}
catch {
throw new Error(`Unable to find electron's version number, either install it or specify an explicit version`);
}
}
let rootDirectory = argv['module-dir'];
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(import.meta.dirname, '../../..');
if (!fs.existsSync(rootDirectory) ||
!fs.existsSync(path.resolve(rootDirectory, 'package.json'))) {
// Then we try the CWD
rootDirectory = process.cwd();
if (!fs.existsSync(rootDirectory) ||
!fs.existsSync(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);
}
const forceAbi = argv['force-abi'] ? Number(argv['force-abi']) : undefined;
if (argv['force-abi'] && Number.isNaN(forceAbi)) {
throw new Error('force-abi must be a number');
}
const jobs = argv.jobs ? Number(argv.jobs) : undefined;
if (argv.jobs && Number.isNaN(jobs)) {
throw new Error('jobs must be a number');
}
console.error('Searching dependency tree');
const rebuilder = rebuild({
buildPath: rootDirectory,
electronVersion: electronModuleVersion,
arch: argv.arch || process.arch,
platform: argv.platform || process.platform,
extraModules: argv['which-module'] ? argv['which-module'].split(',') : [],
onlyModules: argv.only ? argv.only.split(',') : null,
force: argv.force,
headerURL: argv['dist-url'] || process.env.ELECTRON_REBUILD_DIST_URL,
types: argv.types ? argv.types.split(',') : ['prod', 'optional'],
mode: argv.parallel ? 'parallel' : argv.sequential ? 'sequential' : undefined,
debug: argv.debug,
prebuildTagPrefix: argv['prebuild-tag-prefix'] ?? 'v',
forceABI: forceAbi,
useElectronClang: !!argv['use-electron-clang'],
disablePreGypCopy: !!argv['disable-pre-gyp-copy'],
projectRootPath,
buildFromSource: !!argv['build-from-source'],
jobs,
});
const lifecycle = rebuilder.lifecycle;
lifecycle.on('modules-found', (moduleNames) => {
if (moduleNames.length > 0) {
console.error(`Building modules: ${moduleNames.join(', ')}`);
}
else {
console.error('No native modules found');
}
});
try {
await rebuilder;
}
catch (err) {
console.error(styleText('red', '✖ Rebuild Failed'));
throw err;
}
console.error(styleText('green', '✔ Rebuild Complete'));
})();
//# sourceMappingURL=cli.js.map
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
export declare const ELECTRON_GYP_DIR: string;
-4
View File
@@ -1,4 +0,0 @@
import os from 'node:os';
import path from 'node:path';
export const ELECTRON_GYP_DIR = path.resolve(os.homedir(), '.electron-gyp');
//# sourceMappingURL=constants.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC"}
-8
View File
@@ -1,8 +0,0 @@
/**
* Detects the libc family on the current Linux host via `process.report`.
*
* Used to resolve the `{libc}` token in prebuilt binary path templates.
*
* @returns `'glibc'` | `'musl'` | `null` (non-Linux or unable to detect)
*/
export declare function detectLibcFamily(): string | null;
-24
View File
@@ -1,24 +0,0 @@
let cached;
/**
* Detects the libc family on the current Linux host via `process.report`.
*
* Used to resolve the `{libc}` token in prebuilt binary path templates.
*
* @returns `'glibc'` | `'musl'` | `null` (non-Linux or unable to detect)
*/
export function detectLibcFamily() {
if (cached !== undefined)
return cached;
if (process.platform !== 'linux')
return (cached = null);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const report = process.report?.getReport();
if (report?.header?.glibcVersionRuntime)
return (cached = 'glibc');
if (Array.isArray(report?.sharedObjects) &&
report.sharedObjects.some((s) => s.includes('libc.musl') || s.includes('ld-musl'))) {
return (cached = 'musl');
}
return (cached = null);
}
//# sourceMappingURL=detect-libc.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"detect-libc.js","sourceRoot":"","sources":["../src/detect-libc.ts"],"names":[],"mappings":"AAAA,IAAI,MAAiC,CAAC;AAEtC;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEzD,8DAA8D;IAC9D,MAAM,MAAM,GAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IAChD,IAAI,MAAM,EAAE,MAAM,EAAE,mBAAmB;QAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IACnE,IACE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC;QACpC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAC1F,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AACzB,CAAC"}
-1
View File
@@ -1 +0,0 @@
export declare function locateElectronModule(projectRootPath?: string | undefined, startDir?: string | undefined): Promise<string | null>;
-31
View File
@@ -1,31 +0,0 @@
import fs from 'node:fs';
import path from 'node:path';
import { searchForModule } from './search-module.js';
import { fileURLToPath } from 'node:url';
const electronModuleNames = ['electron', 'electron-prebuilt-compile'];
async function locateModuleByImport() {
for (const moduleName of electronModuleNames) {
try {
const modulePath = path.resolve(fileURLToPath(import.meta.resolve(`${moduleName}/package.json`)), '..');
if (fs.existsSync(path.join(modulePath, 'package.json'))) {
return modulePath;
}
}
catch {
// eslint-disable-line no-empty
}
}
return null;
}
export async function locateElectronModule(projectRootPath, startDir) {
startDir ??= process.cwd();
for (const moduleName of electronModuleNames) {
const electronPaths = await searchForModule(startDir, moduleName, projectRootPath);
const electronPath = electronPaths.find((ePath) => fs.existsSync(path.join(ePath, 'package.json')));
if (electronPath) {
return electronPath;
}
}
return locateModuleByImport();
}
//# sourceMappingURL=electron-locator.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"electron-locator.js","sourceRoot":"","sources":["../src/electron-locator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,mBAAmB,GAAG,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;AAEtE,KAAK,UAAU,oBAAoB;IACjC,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAC7B,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,UAAU,eAAe,CAAC,CAAC,EAChE,IAAI,CACL,CAAC;YACF,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;gBACzD,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,eAAoC,EACpC,QAA6B;IAE7B,QAAQ,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;IAE3B,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE,CAAC;QAC7C,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QACnF,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE,CACxD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAChD,CAAC;QAEF,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,oBAAoB,EAAE,CAAC;AAChC,CAAC"}
-1
View File
@@ -1 +0,0 @@
export declare function fetchUrl<T extends 'buffer' | 'text', RT = T extends 'buffer' ? Buffer : string>(url: string, responseType: T, retries?: number): Promise<RT>;
-27
View File
@@ -1,27 +0,0 @@
import debug from 'debug';
import { setTimeout as sleep } from 'node:timers/promises';
const d = debug('electron-rebuild');
export async function fetchUrl(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 globalThis.fetch(url);
if (!response.ok) {
d('got bad status code:', response.status);
await sleep(2000);
return fetchUrl(url, responseType, retries - 1);
}
d('response came back OK');
if (responseType === 'buffer') {
return Buffer.from(await response.arrayBuffer());
}
return (await response.text());
}
catch (err) {
d('request failed for some reason', err);
await sleep(2000);
return fetchUrl(url, responseType, retries - 1);
}
}
//# sourceMappingURL=fetcher.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,CAAC,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAG5B,GAAW,EAAE,YAAe,EAAE,OAAO,GAAG,CAAC;IACzC,IAAI,OAAO,KAAK,CAAC;QACf,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;IACJ,CAAC,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,CAAC,CAAC,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,CAAC,CAAC,uBAAuB,CAAC,CAAC;QAC3B,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAO,CAAC;QACzD,CAAC;QACD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAO,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,CAAC,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
-2
View File
@@ -1,2 +0,0 @@
import { rebuild, RebuildOptions } from './rebuild.js';
export { rebuild, RebuildOptions };
-3
View File
@@ -1,3 +0,0 @@
import { rebuild } from './rebuild.js';
export { rebuild };
//# sourceMappingURL=main.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAkB,CAAC"}
-34
View File
@@ -1,34 +0,0 @@
import { IRebuilder } from './types.js';
export declare class ModuleRebuilder {
private modulePath;
private nodeGyp;
private rebuilder;
private prebuildify;
private prebuildInstall;
private nodePreGyp;
constructor(rebuilder: IRebuilder, modulePath: string);
get metaPath(): string;
/**
* The marker written to `.forge-meta` after a successful rebuild, and compared against on
* subsequent runs to decide whether the module can be skipped. It must capture every input
* that changes the resulting binary, so that e.g. a Linux build is not reused for macOS.
*/
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>;
findNodePreGypInstallModule(cacheKey: string): Promise<boolean>;
rebuildNodeGypModule(cacheKey: string): Promise<boolean>;
replaceExistingNativeModule(): Promise<void>;
writeMetadata(): Promise<void>;
rebuild(cacheKey: string): Promise<boolean>;
}
-132
View File
@@ -1,132 +0,0 @@
import debug from 'debug';
import fs from 'node:fs';
import path from 'node:path';
import { cacheModuleState } from './cache.js';
import { NodeGyp } from './module-type/node-gyp/node-gyp.js';
import { Prebuildify } from './module-type/prebuildify.js';
import { PrebuildInstall } from './module-type/prebuild-install.js';
import { NodePreGyp } from './module-type/node-pre-gyp.js';
const d = debug('electron-rebuild');
export class ModuleRebuilder {
modulePath;
nodeGyp;
rebuilder;
prebuildify;
prebuildInstall;
nodePreGyp;
constructor(rebuilder, modulePath) {
this.modulePath = modulePath;
this.rebuilder = rebuilder;
this.nodeGyp = new NodeGyp(rebuilder, modulePath);
this.prebuildify = new Prebuildify(rebuilder, modulePath);
this.prebuildInstall = new PrebuildInstall(rebuilder, modulePath);
this.nodePreGyp = new NodePreGyp(rebuilder, modulePath);
}
get metaPath() {
return path.resolve(this.modulePath, 'build', this.rebuilder.buildType, '.forge-meta');
}
/**
* The marker written to `.forge-meta` after a successful rebuild, and compared against on
* subsequent runs to decide whether the module can be skipped. It must capture every input
* that changes the resulting binary, so that e.g. a Linux build is not reused for macOS.
*/
get metaData() {
return `${this.rebuilder.platform}--${this.rebuilder.arch}--${this.rebuilder.ABI}`;
}
async alreadyBuiltByRebuild() {
if (fs.existsSync(this.metaPath)) {
const meta = await fs.promises.readFile(this.metaPath, 'utf8');
return meta === this.metaData;
}
return false;
}
async cacheModuleState(cacheKey) {
if (this.rebuilder.useCache) {
await 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 findNodePreGypInstallModule(cacheKey) {
if (await this.nodePreGyp.usesTool()) {
d(`assuming is node-pre-gyp powered: ${this.nodePreGyp.moduleName}`);
if (await this.nodePreGyp.findPrebuiltModule()) {
d('installed prebuilt module:', this.nodePreGyp.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.promises.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 && fs.existsSync(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.promises.mkdir(abiPath, { recursive: true });
await fs.promises.copyFile(nodePath, path.join(abiPath, `${this.nodeGyp.moduleName}.node`));
}
}
}
async writeMetadata() {
await fs.promises.mkdir(path.dirname(this.metaPath), { recursive: true });
await fs.promises.writeFile(this.metaPath, this.metaData);
}
async rebuild(cacheKey) {
if (!this.rebuilder.buildFromSource &&
((await this.findPrebuildifyModule(cacheKey)) ||
(await this.findPrebuildInstallModule(cacheKey)) ||
(await this.findNodePreGypInstallModule(cacheKey)))) {
return true;
}
return await this.rebuildNodeGypModule(cacheKey);
}
}
//# sourceMappingURL=module-rebuilder.js.map
File diff suppressed because one or more lines are too long
-22
View File
@@ -1,22 +0,0 @@
import { NodeAPI } from '../node-api.js';
import { IRebuilder } from '../types.js';
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>;
/**
* Search dependencies for package using either `packageName` or
* `@namespace/packageName` in the case of forks.
*/
findPackageInDependencies(packageName: string, packageProperty?: string): Promise<string | null>;
}
export declare function locateBinary(basePath: string, suffix: string): Promise<string | null>;
export {};
-68
View File
@@ -1,68 +0,0 @@
import fs from 'node:fs';
import path from 'node:path';
import { NodeAPI } from '../node-api.js';
import { readPackageJson } from '../read-package-json.js';
export class NativeModule {
rebuilder;
_moduleName;
modulePath;
nodeAPI;
packageJSON;
constructor(rebuilder, modulePath) {
this.rebuilder = rebuilder;
this.modulePath = modulePath;
this.nodeAPI = new NodeAPI(this.moduleName, this.rebuilder.electronVersion);
}
get moduleName() {
if (!this._moduleName) {
const basename = path.basename(this.modulePath);
const parentDir = path.basename(path.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 ||= await readPackageJson(this.modulePath);
return this.packageJSON[key];
}
async getSupportedNapiVersions() {
const binary = (await this.packageJSONFieldWithDefault('binary', {}));
return binary?.napi_versions;
}
/**
* Search dependencies for package using either `packageName` or
* `@namespace/packageName` in the case of forks.
*/
async findPackageInDependencies(packageName, packageProperty = 'dependencies') {
const dependencies = await this.packageJSONFieldWithDefault(packageProperty, {});
if (typeof dependencies !== 'object')
return null;
// Look for direct dependency match
// eslint-disable-next-line no-prototype-builtins
if (dependencies.hasOwnProperty(packageName))
return packageName;
const forkedPackage = Object.keys(dependencies).find((dependency) => dependency.startsWith('@') && dependency.endsWith(`/${packageName}`));
return forkedPackage || null;
}
}
export async function locateBinary(basePath, suffix) {
let parentPath = basePath;
let testPath;
while (testPath !== parentPath) {
testPath = parentPath;
const checkPath = path.resolve(testPath, suffix);
if (fs.existsSync(checkPath)) {
return checkPath;
}
parentPath = path.resolve(testPath, '..');
}
return null;
}
//# sourceMappingURL=index.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/module-type/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
import { NativeModule } from '../index.js';
export declare class NodeGyp extends NativeModule {
buildArgs(prefixedArgs: string[]): Promise<string[]>;
buildArgsFromBinaryField(): Promise<string[]>;
rebuildModule(): Promise<void>;
}
-125
View File
@@ -1,125 +0,0 @@
import { fork } from 'node:child_process';
import debug from 'debug';
import path from 'node:path';
import { ELECTRON_GYP_DIR } from '../../constants.js';
import { getClangEnvironmentVars } from '../../clang-fetcher.js';
import { NativeModule } from '../index.js';
import { detectLibcFamily } from '../../detect-libc.js';
const d = debug('electron-rebuild');
export class NodeGyp extends 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}`);
}
if (this.rebuilder.jobs) {
args.push(`--jobs=${this.rebuilder.jobs}`);
}
// 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
const [maj, min] = this.rebuilder.electronVersion.split('.').map(Number);
if (maj < 14 || (maj === 14 && min < 2) || (maj === 15 && min < 3)) {
args.push('--force-process-config');
}
return args;
}
async buildArgsFromBinaryField() {
const binary = (await this.packageJSONFieldWithDefault('binary', {}));
let napiBuildVersion = undefined;
if (Array.isArray(binary.napi_versions)) {
napiBuildVersion = this.nodeAPI.getNapiVersion(binary.napi_versions.map((str) => Number(str)));
}
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.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}', detectLibcFamily() || 'unknown');
if (napiBuildVersion !== undefined) {
value = value.replace('{napi_build_version}', napiBuildVersion.toString());
}
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.rebuilder.platform !== process.platform) {
throw new Error('node-gyp does not support cross-compiling native modules from source.');
}
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}`);
}
const env = {
...process.env,
};
const extraNodeGypArgs = [];
if (this.rebuilder.useElectronClang) {
const { env: clangEnv, args: clangArgs } = await getClangEnvironmentVars(this.rebuilder.electronVersion, this.rebuilder.arch);
Object.assign(env, clangEnv);
extraNodeGypArgs.push(...clangArgs);
}
const nodeGypArgs = await this.buildArgs(extraNodeGypArgs);
d('rebuilding', this.moduleName, 'with args', nodeGypArgs);
const forkedChild = fork(path.resolve(import.meta.dirname, 'worker.js'), {
env,
cwd: this.modulePath,
stdio: 'pipe',
});
const outputBuffers = [];
forkedChild.stdout?.on('data', (chunk) => {
outputBuffers.push(chunk);
});
forkedChild.stderr?.on('data', (chunk) => {
outputBuffers.push(chunk);
});
forkedChild.send({
moduleName: this.moduleName,
nodeGypArgs,
extraNodeGypArgs,
devDir: this.rebuilder.mode === 'sequential'
? ELECTRON_GYP_DIR
: path.resolve(ELECTRON_GYP_DIR, '_p', this.moduleName),
});
await new Promise((resolve, reject) => {
forkedChild.on('exit', (code) => {
if (code === 0)
return resolve();
console.error(Buffer.concat(outputBuffers).toString());
reject(new Error(`node-gyp failed to rebuild '${this.modulePath}'`));
});
});
}
}
//# sourceMappingURL=node-gyp.js.map
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
export {};
-32
View File
@@ -1,32 +0,0 @@
import NodeGypRunner from 'node-gyp';
process.on('message', async ({ nodeGypArgs, devDir, extraNodeGypArgs }) => {
const nodeGyp = NodeGypRunner();
nodeGyp.parseArgv(nodeGypArgs);
nodeGyp.devDir = devDir;
let command = nodeGyp.todo.shift();
try {
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 nodeGyp.commands[command.name](command.args);
command = nodeGyp.todo.shift();
}
process.exit(0);
}
catch (err) {
console.error(err);
process.exit(1);
}
});
//# sourceMappingURL=worker.js.map
@@ -1 +0,0 @@
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/module-type/node-gyp/worker.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,UAAU,CAAC;AAErC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE;IACxE,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC/B,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,OAAO,EAAE,CAAC;YACf,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YACvF,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACpE,oFAAoF;gBACpF,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,EAA2B,EAAE,EAAE;oBACjD,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE;wBAC5D,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;4BAAE,OAAO,GAAG,CAAC;wBACtC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;oBACjB,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACnD,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
-10
View File
@@ -1,10 +0,0 @@
import { NativeModule } from './index.js';
export declare class NodePreGyp extends NativeModule {
usesTool(): Promise<boolean>;
locateBinary(): Promise<string | null>;
run(nodePreGypPath: string): Promise<void>;
findPrebuiltModule(): Promise<boolean>;
getNodePreGypRuntimeArgs(): Promise<string[]>;
private shouldUpdateBinary;
private getModulePaths;
}
-110
View File
@@ -1,110 +0,0 @@
import debug from 'debug';
import { readBinaryFileArch } from 'read-binary-file-arch';
import { locateBinary, NativeModule } from './index.js';
import { spawn } from '@malept/cross-spawn-promise';
const d = debug('electron-rebuild');
export class NodePreGyp extends NativeModule {
async usesTool() {
const packageName = await this.findPackageInDependencies('node-pre-gyp');
return !!packageName;
}
async locateBinary() {
const packageName = await this.findPackageInDependencies('node-pre-gyp');
if (!packageName)
return null;
return locateBinary(this.modulePath, `node_modules/${packageName}/bin/node-pre-gyp`);
}
async run(nodePreGypPath) {
const redownloadBinary = await this.shouldUpdateBinary(nodePreGypPath);
await spawn(process.execPath, [
nodePreGypPath,
'reinstall',
'--fallback-to-build',
...(redownloadBinary ? ['--update-binary'] : []),
`--arch=${this.rebuilder.arch}`, // fallback build arch
`--target_arch=${this.rebuilder.arch}`, // prebuild arch
`--target_platform=${this.rebuilder.platform}`,
...(await this.getNodePreGypRuntimeArgs()),
], {
cwd: this.modulePath,
});
}
async findPrebuiltModule() {
const nodePreGypPath = await this.locateBinary();
if (nodePreGypPath) {
d(`triggering prebuild download step: ${this.moduleName}`);
try {
await this.run(nodePreGypPath);
return true;
}
catch (err) {
d('failed to use node-pre-gyp:', err);
if (err?.message?.includes('requires Node-API but Electron')) {
throw err;
}
}
}
else {
d(`could not find node-pre-gyp relative to: ${this.modulePath}`);
}
return false;
}
async getNodePreGypRuntimeArgs() {
const moduleNapiVersions = await this.getSupportedNapiVersions();
if (moduleNapiVersions) {
return [];
}
else {
return [
'--runtime=electron',
`--target=${this.rebuilder.electronVersion}`,
`--dist-url=${this.rebuilder.headerURL}`,
];
}
}
async shouldUpdateBinary(nodePreGypPath) {
let shouldUpdate = false;
// Redownload binary only if the existing module arch differs from the
// target arch.
try {
const modulePaths = await this.getModulePaths(nodePreGypPath);
d('module paths:', modulePaths);
for (const modulePath of modulePaths) {
let moduleArch;
try {
moduleArch = await readBinaryFileArch(modulePath);
d('module arch:', moduleArch);
}
catch (error) {
d('failed to read module arch:', error.message);
continue;
}
if (moduleArch && moduleArch !== this.rebuilder.arch) {
shouldUpdate = true;
d('module architecture differs:', `${moduleArch} !== ${this.rebuilder.arch}`);
break;
}
}
}
catch (error) {
d('failed to get existing binary arch:', error.message);
// Assume architecture differs
shouldUpdate = true;
}
return shouldUpdate;
}
async getModulePaths(nodePreGypPath) {
const results = await spawn(process.execPath, [
nodePreGypPath,
'reveal',
'module', // pick property with module path
`--target_arch=${this.rebuilder.arch}`,
`--target_platform=${this.rebuilder.platform}`,
], {
cwd: this.modulePath,
});
// Packages with multiple binaries will output one per line
return results.split('\n').filter(Boolean);
}
}
//# sourceMappingURL=node-pre-gyp.js.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"node-pre-gyp.js","sourceRoot":"","sources":["../../src/module-type/node-pre-gyp.ts"],"names":[],"mappings":"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"}