electron-notarize
Advanced tools
Comparing version 0.0.4 to 0.0.5
@@ -9,38 +9,81 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const debug = require("debug"); | ||
const fs = require("fs-extra"); | ||
const os = require("os"); | ||
const path = require("path"); | ||
const d = debug('electron-notarize:helpers'); | ||
var debug = require("debug"); | ||
var fs = require("fs-extra"); | ||
var os = require("os"); | ||
var path = require("path"); | ||
var d = debug('electron-notarize:helpers'); | ||
function withTempDir(fn) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
const dir = yield fs.mkdtemp(path.resolve(os.tmpdir(), 'electron-notarize-')); | ||
d('doing work inside temp dir:', dir); | ||
let result; | ||
try { | ||
result = yield fn(dir); | ||
} | ||
catch (err) { | ||
d('work failed'); | ||
yield fs.remove(dir); | ||
throw err; | ||
} | ||
d('work succeeded'); | ||
yield fs.remove(dir); | ||
return result; | ||
return __awaiter(this, void 0, void 0, function () { | ||
var dir, result, err_1; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, fs.mkdtemp(path.resolve(os.tmpdir(), 'electron-notarize-'))]; | ||
case 1: | ||
dir = _a.sent(); | ||
d('doing work inside temp dir:', dir); | ||
_a.label = 2; | ||
case 2: | ||
_a.trys.push([2, 4, , 6]); | ||
return [4 /*yield*/, fn(dir)]; | ||
case 3: | ||
result = _a.sent(); | ||
return [3 /*break*/, 6]; | ||
case 4: | ||
err_1 = _a.sent(); | ||
d('work failed'); | ||
return [4 /*yield*/, fs.remove(dir)]; | ||
case 5: | ||
_a.sent(); | ||
throw err_1; | ||
case 6: | ||
d('work succeeded'); | ||
return [4 /*yield*/, fs.remove(dir)]; | ||
case 7: | ||
_a.sent(); | ||
return [2 /*return*/, result]; | ||
} | ||
}); | ||
}); | ||
} | ||
exports.withTempDir = withTempDir; | ||
class Secret { | ||
constructor(value) { | ||
var Secret = /** @class */ (function () { | ||
function Secret(value) { | ||
this.value = value; | ||
} | ||
toString() { | ||
Secret.prototype.toString = function () { | ||
return this.value; | ||
} | ||
inpsect() { | ||
}; | ||
Secret.prototype.inpsect = function () { | ||
return '******'; | ||
} | ||
} | ||
}; | ||
return Secret; | ||
}()); | ||
function makeSecret(s) { | ||
@@ -55,5 +98,5 @@ return new Secret(s); | ||
function parseNotarizationInfo(info) { | ||
const out = {}; | ||
const matchToProperty = (key, r, modifier) => { | ||
const exec = r.exec(info); | ||
var out = {}; | ||
var matchToProperty = function (key, r, modifier) { | ||
var exec = r.exec(info); | ||
if (exec) { | ||
@@ -64,6 +107,6 @@ out[key] = modifier ? modifier(exec[1]) : exec[1]; | ||
matchToProperty('uuid', /\n *RequestUUID: (.+?)\n/); | ||
matchToProperty('date', /\n *Date: (.+?)\n/, d => new Date(d)); | ||
matchToProperty('date', /\n *Date: (.+?)\n/, function (d) { return new Date(d); }); | ||
matchToProperty('status', /\n *Status: (.+?)\n/); | ||
matchToProperty('logFileUrl', /\n *LogFileURL: (.+?)\n/); | ||
matchToProperty('statusCode', /\n *Status Code: (.+?)\n/, n => parseInt(n, 10)); | ||
matchToProperty('statusCode', /\n *Status Code: (.+?)\n/, function (n) { return parseInt(n, 10); }); | ||
matchToProperty('statusMessage', /\n *Status Message: (.+?)\n/); | ||
@@ -70,0 +113,0 @@ if (out.logFileUrl === '(null)') { |
277
lib/index.js
@@ -9,51 +9,95 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const debug = require("debug"); | ||
const path = require("path"); | ||
const spawn_1 = require("./spawn"); | ||
const helpers_1 = require("./helpers"); | ||
const d = debug('electron-notarize'); | ||
var debug = require("debug"); | ||
var path = require("path"); | ||
var spawn_1 = require("./spawn"); | ||
var helpers_1 = require("./helpers"); | ||
var d = debug('electron-notarize'); | ||
function startNotarize(opts) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
d('starting notarize process for app:', opts.appPath); | ||
return yield helpers_1.withTempDir((dir) => __awaiter(this, void 0, void 0, function* () { | ||
const zipPath = path.resolve(dir, `${path.basename(opts.appPath, '.app')}.zip`); | ||
d('zipping application to:', zipPath); | ||
const zipResult = yield spawn_1.spawn('zip', [ | ||
'-r', | ||
'-y', | ||
zipPath, | ||
path.basename(opts.appPath), | ||
], { | ||
cwd: path.dirname(opts.appPath), | ||
}); | ||
if (zipResult.code !== 0) { | ||
throw new Error(`Failed to zip application, exited with code: ${zipResult.code}\n\n${zipResult.output}`); | ||
return __awaiter(this, void 0, void 0, function () { | ||
var _this = this; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
d('starting notarize process for app:', opts.appPath); | ||
return [4 /*yield*/, helpers_1.withTempDir(function (dir) { return __awaiter(_this, void 0, void 0, function () { | ||
var zipPath, zipResult, result, uuidMatch; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
zipPath = path.resolve(dir, path.basename(opts.appPath, '.app') + ".zip"); | ||
d('zipping application to:', zipPath); | ||
return [4 /*yield*/, spawn_1.spawn('zip', [ | ||
'-r', | ||
'-y', | ||
zipPath, | ||
path.basename(opts.appPath), | ||
], { | ||
cwd: path.dirname(opts.appPath), | ||
})]; | ||
case 1: | ||
zipResult = _a.sent(); | ||
if (zipResult.code !== 0) { | ||
throw new Error("Failed to zip application, exited with code: " + zipResult.code + "\n\n" + zipResult.output); | ||
} | ||
d('zip succeeded, attempting to upload to apple'); | ||
return [4 /*yield*/, spawn_1.spawn('xcrun', [ | ||
'altool', | ||
'--notarize-app', | ||
'-f', | ||
zipPath, | ||
'--primary-bundle-id', | ||
opts.appBundleId, | ||
'-u', | ||
helpers_1.makeSecret(opts.appleId), | ||
'-p', | ||
helpers_1.makeSecret(opts.appleIdPassword), | ||
])]; | ||
case 2: | ||
result = _a.sent(); | ||
if (result.code !== 0) { | ||
throw new Error("Failed to upload app to Apples notarization servers\n\n" + result.output); | ||
} | ||
d('upload success'); | ||
uuidMatch = /\nRequestUUID = (.+?)\n/g.exec(result.output); | ||
if (!uuidMatch) { | ||
throw new Error("Failed to find request UUID in output:\n\n" + result.output); | ||
} | ||
d('found UUID:', uuidMatch[1]); | ||
return [2 /*return*/, { | ||
uuid: uuidMatch[1], | ||
}]; | ||
} | ||
}); | ||
}); })]; | ||
case 1: return [2 /*return*/, _a.sent()]; | ||
} | ||
d('zip succeeded, attempting to upload to apple'); | ||
const result = yield spawn_1.spawn('xcrun', [ | ||
'altool', | ||
'--notarize-app', | ||
'-f', | ||
zipPath, | ||
'--primary-bundle-id', | ||
opts.appBundleId, | ||
'-u', | ||
helpers_1.makeSecret(opts.appleId), | ||
'-p', | ||
helpers_1.makeSecret(opts.appleIdPassword), | ||
]); | ||
if (result.code !== 0) { | ||
throw new Error(`Failed to upload app to Apples notarization servers\n\n${result.output}`); | ||
} | ||
d('upload success'); | ||
const uuidMatch = /\nRequestUUID = (.+?)\n/g.exec(result.output); | ||
if (!uuidMatch) { | ||
throw new Error(`Failed to find request UUID in output:\n\n${result.output}`); | ||
} | ||
d('found UUID:', uuidMatch[1]); | ||
return { | ||
uuid: uuidMatch[1], | ||
}; | ||
})); | ||
}); | ||
}); | ||
@@ -63,36 +107,42 @@ } | ||
function waitForNotarize(opts) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
d('checking notarization status:', opts.uuid); | ||
const result = yield spawn_1.spawn('xcrun', [ | ||
'altool', | ||
'--notarization-info', | ||
opts.uuid, | ||
'-u', | ||
helpers_1.makeSecret(opts.appleId), | ||
'-p', | ||
helpers_1.makeSecret(opts.appleIdPassword), | ||
]); | ||
if (result.code !== 0) { | ||
throw new Error(`Failed to check status of notarization request: ${opts.uuid}\n\n${result.output}`); | ||
} | ||
const notarizationInfo = helpers_1.parseNotarizationInfo(result.output); | ||
if (notarizationInfo.status === 'in progress') { | ||
d('still in progress, waiting 30 seconds'); | ||
yield new Promise(r => setTimeout(r, 30000)); | ||
return waitForNotarize(opts); | ||
} | ||
d('notarzation done with info:', notarizationInfo); | ||
if (notarizationInfo.status === 'invalid') { | ||
d('notarization failed'); | ||
throw new Error(`Apple failed to notarize your application, check the logs for more info | ||
Status Code: ${notarizationInfo.statusCode || 'No Code'} | ||
Message: ${notarizationInfo.statusMessage || 'No Message'} | ||
Logs: ${notarizationInfo.logFileUrl}`); | ||
} | ||
if (notarizationInfo.status !== 'success') { | ||
throw new Error(`Unrecognized notarization status: "${notarizationInfo.status}"`); | ||
} | ||
d('notarization was successful'); | ||
return; | ||
return __awaiter(this, void 0, void 0, function () { | ||
var result, notarizationInfo; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
d('checking notarization status:', opts.uuid); | ||
return [4 /*yield*/, spawn_1.spawn('xcrun', [ | ||
'altool', | ||
'--notarization-info', | ||
opts.uuid, | ||
'-u', | ||
helpers_1.makeSecret(opts.appleId), | ||
'-p', | ||
helpers_1.makeSecret(opts.appleIdPassword), | ||
])]; | ||
case 1: | ||
result = _a.sent(); | ||
if (result.code !== 0) { | ||
throw new Error("Failed to check status of notarization request: " + opts.uuid + "\n\n" + result.output); | ||
} | ||
notarizationInfo = helpers_1.parseNotarizationInfo(result.output); | ||
if (!(notarizationInfo.status === 'in progress')) return [3 /*break*/, 3]; | ||
d('still in progress, waiting 30 seconds'); | ||
return [4 /*yield*/, new Promise(function (r) { return setTimeout(r, 30000); })]; | ||
case 2: | ||
_a.sent(); | ||
return [2 /*return*/, waitForNotarize(opts)]; | ||
case 3: | ||
d('notarzation done with info:', notarizationInfo); | ||
if (notarizationInfo.status === 'invalid') { | ||
d('notarization failed'); | ||
throw new Error("Apple failed to notarize your application, check the logs for more info\n\nStatus Code: " + (notarizationInfo.statusCode || 'No Code') + "\nMessage: " + (notarizationInfo.statusMessage || 'No Message') + "\nLogs: " + notarizationInfo.logFileUrl); | ||
} | ||
if (notarizationInfo.status !== 'success') { | ||
throw new Error("Unrecognized notarization status: \"" + notarizationInfo.status + "\""); | ||
} | ||
d('notarization was successful'); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); | ||
@@ -102,30 +152,51 @@ } | ||
function stapleApp(opts) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
d('attempting to staple app:', opts.appPath); | ||
const result = yield spawn_1.spawn('xcrun', [ | ||
'stapler', | ||
'staple', | ||
'-v', | ||
path.basename(opts.appPath), | ||
], { | ||
cwd: path.dirname(opts.appPath), | ||
return __awaiter(this, void 0, void 0, function () { | ||
var result; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
d('attempting to staple app:', opts.appPath); | ||
return [4 /*yield*/, spawn_1.spawn('xcrun', [ | ||
'stapler', | ||
'staple', | ||
'-v', | ||
path.basename(opts.appPath), | ||
], { | ||
cwd: path.dirname(opts.appPath), | ||
})]; | ||
case 1: | ||
result = _a.sent(); | ||
if (result.code !== 0) { | ||
throw new Error("Failed to staple your application with code: " + result.code + "\n\n" + result.output); | ||
} | ||
d('staple succeeded'); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
if (result.code !== 0) { | ||
throw new Error(`Failed to staple your application with code: ${result.code}\n\n${result.output}`); | ||
} | ||
d('staple succeeded'); | ||
return; | ||
}); | ||
} | ||
exports.stapleApp = stapleApp; | ||
function notarize({ appBundleId, appPath, appleId, appleIdPassword, }) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
const { uuid } = yield startNotarize({ | ||
appBundleId, | ||
appPath, | ||
appleId, | ||
appleIdPassword, | ||
function notarize(_a) { | ||
var appBundleId = _a.appBundleId, appPath = _a.appPath, appleId = _a.appleId, appleIdPassword = _a.appleIdPassword; | ||
return __awaiter(this, void 0, void 0, function () { | ||
var uuid; | ||
return __generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: return [4 /*yield*/, startNotarize({ | ||
appBundleId: appBundleId, | ||
appPath: appPath, | ||
appleId: appleId, | ||
appleIdPassword: appleIdPassword, | ||
})]; | ||
case 1: | ||
uuid = (_b.sent()).uuid; | ||
return [4 /*yield*/, waitForNotarize({ uuid: uuid, appleId: appleId, appleIdPassword: appleIdPassword })]; | ||
case 2: | ||
_b.sent(); | ||
return [4 /*yield*/, stapleApp({ appPath: appPath })]; | ||
case 3: | ||
_b.sent(); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
yield waitForNotarize({ uuid, appleId, appleIdPassword }); | ||
yield stapleApp({ appPath }); | ||
}); | ||
@@ -132,0 +203,0 @@ } |
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const child_process_1 = require("child_process"); | ||
const debug = require("debug"); | ||
const helpers_1 = require("./helpers"); | ||
const d = debug('electron-notarize:spawn'); | ||
exports.spawn = (cmd, args = [], opts = {}) => { | ||
d('spawning cmd:', cmd, 'args:', args.map(arg => helpers_1.isSecret(arg) ? '*********' : arg), 'opts:', opts); | ||
const child = child_process_1.spawn(cmd, args, opts); | ||
const out = []; | ||
const dataHandler = (data) => out.push(data.toString()); | ||
var child_process_1 = require("child_process"); | ||
var debug = require("debug"); | ||
var helpers_1 = require("./helpers"); | ||
var d = debug('electron-notarize:spawn'); | ||
exports.spawn = function (cmd, args, opts) { | ||
if (args === void 0) { args = []; } | ||
if (opts === void 0) { opts = {}; } | ||
d('spawning cmd:', cmd, 'args:', args.map(function (arg) { return helpers_1.isSecret(arg) ? '*********' : arg; }), 'opts:', opts); | ||
var child = child_process_1.spawn(cmd, args, opts); | ||
var out = []; | ||
var dataHandler = function (data) { return out.push(data.toString()); }; | ||
child.stdout.on('data', dataHandler); | ||
child.stderr.on('data', dataHandler); | ||
return new Promise((resolve) => { | ||
child.on('exit', (code) => { | ||
d(`cmd ${cmd} terminated with code: ${code}`); | ||
return new Promise(function (resolve) { | ||
child.on('exit', function (code) { | ||
d("cmd " + cmd + " terminated with code: " + code); | ||
resolve({ | ||
code, | ||
code: code, | ||
output: out.join(''), | ||
@@ -19,0 +21,0 @@ }); |
{ | ||
"name": "electron-notarize", | ||
"version": "0.0.4", | ||
"version": "0.0.5", | ||
"description": "Notarize your Electron app", | ||
@@ -5,0 +5,0 @@ "main": "lib/index.js", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
67083
386